MFC ActiveX控件的创建与使用(VS2010)

1.ActiveX的基本概念

         ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。这个容器包括WEB网页,应用程序窗体等。。。

         ActiveX控件的后缀名是OCX或者DLL。一般是以OCX和动态库共存的形式打包成cab或者exe的文件放在服务器上,客户端下载后运行安装cab或exe解压成OCX和动态库共存的文件,然后注册ocx文件。

         ActiveX控件是基于com标准,使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序,此外ActiveX一般具有界面。

 

2.三个概念:ActiveX、OLE和COM

        从时间的角度讲,OLE是最早出现的,然后是COM和 ActiveX;从体系结构角度讲,OLE和ActiveX是建立在COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说ActiveX和OLE的原因。COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。ActiveX最核心的技术还是COM。ActiveX和OLE的最大不同在于,OLE针对的是桌面上应用软件和文件之间的集成,而 ActiveX则以提供进一步的网络应用与用户交互为主。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL还是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧非常有用。

 

3.VS2010创建ActiveX

新建名为MyFirstActive的工程,如图

 

 

 

 

 点击【ok】,随后一路保持默认即可,最后点击【Finish】按钮

 

 

可以打开上面三个类的头文件及cpp文件,发现它们都是派生类。

MyFirstActive.cpp:cpp文件中定义了DllRegisterServer和DllUnregisterServer,可以发现ActiveX的注册和反组册都与该类有关。

MyFirstActiveCtrl.cpp:可以发现该头文件中声明了消息映射(让ActiveX控件程序可以接受系统发送的事件通知,如窗体创建和关闭事件),调度映射(让外部调用程序(包含ActiveX的容器)可以方便地访问ActiveX控件的属性和方法),事件映射(让ActiveX控件可以向外部调用程序(包含ActiveX的容器)发送事件通知)。也就是说对ActiveX控件的窗口操作都将在这个类中完成,包括ActiveX控件的创建,重绘,以及在此类中创建可视MFC窗体。

MyFirstActivePropPage.cpp:显示ActiveX控件的属性页的

 

最重要的对外接口定义文件MyFirstActive.idl,代码如下:

复制代码
// MyFirstActive.idl : type library source for ActiveX Control project.

// This file will be processed by the MIDL compiler tool to
// produce the type library (MyFirstActive.tlb) that will become a resource in
// MyFirstActive.ocx.

#include <olectl.h>
#include <idispids.h>

[ uuid(0FEFC517-CA1A-4178-B11F-5CE5CF0861DB), version(1.0),
  control ]
library MyFirstActiveLib
{
    importlib(STDOLE_TLB);

    //  Primary dispatch interface for CMyFirstActiveCtrl
    [ 
        uuid(9B11CEE7-1974-4579-ACDD-551DD26AC5D9)    
    ]
    dispinterface _DMyFirstActive
    {
        properties:
        methods:

            [id(DISPID_ABOUTBOX)] void AboutBox();
    };

    //  Event dispatch interface for CMyFirstActiveCtrl

    [ 
        uuid(28CECEEF-A69E-4124-82AD-FE45F093FE84)    
    ]
    dispinterface _DMyFirstActiveEvents
    {
        properties:
            //  Event interface has no properties

        methods:
    };

    //  Class information for CMyFirstActiveCtrl
    [
        uuid(260A0C6E-1C89-4BB7-A0DD-C1496245094B)
    ]
    coclass MyFirstActive
    {
        [default] dispinterface _DMyFirstActive;
        [default, source] dispinterface _DMyFirstActiveEvents;
    };

};
复制代码

这个就是对外接口定义文件,如果外部程序想要调用ActiveX的方法,属性以及在注册表注册的classid(WEB网页调用需要使用),就必须了解这个文件,这个文件可以分为四个部分来看:

首先是MyFirstActiveLib这个库信息

 

 第二部分是调度映射的接口信息,该接口信息包含了属性(如控件背景色)和对外方法

里面定义了一个方法AboutBox(),该方法就可以被外部程序调用,在该接口里定义的函数都是纯虚函数,这些函数的实现都是在MyFirstActiveCtrl.cpp中完成的,MFC通过底层的封装,让MyFirstActiveCtrl类继承这个接口,实现函数。

 

 第三部分是事件映射的接口信息

 

 第四部分是类的信息,其中uuid就是ActiveX控件注册到注册表的classid,它是ActiveX注册后在系统内的唯一标识,WEB网页就是使用这个ID加载ActiveX控件的

 

 编译,就会生成MyFirstActive.ocx,下面讲一下使用方法:

1.使用html网页

1
2
3
4
5
6
7
8
9
10
11
<HTML
<HEAD
<TITLE>Test ActiveX</TITLE
</HEAD
<OBJECT ID="TestMfcAtl Control" WIDTH=800 HEIGHT=545 classid="CLSID:260A0C6E-1C89-4BB7-A0DD-C1496245094B"> 
    <PARAM NAME="_Version" VALUE="65536"> 
    <PARAM NAME="_ExtentX" VALUE="12806"> 
    <PARAM NAME="_ExtentY" VALUE="1747"> 
    <PARAM NAME="_StockProps" VALUE="0"> 
</OBJECT
</HTML

  

2.建立Mfc应用程序,在Mfc窗口右键-》插入“ActiveX”控件,然后就会在MFC的窗体上显示ActiveX控件

 

3.也是最方便的一种方法,就是使用vs自带的ActiveX Control Test Container来测试ActiveX控件,但是VS2010在“工具”中没有这一项,那么我们首先可以手动把这个工具添加到VS2010里,

 首先,打开C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,解压VC2010Samples.zip

 

 

解压后,再打开目录C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples\C++\MFC\ole\TstCon,打开TstCon.sln

 

 编译,生成TstCon.exe,然后把这个exe导入到VS2010中,点击【Tools】——【External Tools】,

 

 Command路径就是刚才生成TstCon.exe的路径,Title就是一个名称,随便你起都可以的,最后点击ok,这个外部exe就添加成功了。

 

怎么使用?点击【Tools】——【ActiveX Control Test Container】如下

 

 再点击【Edit】——【Insert newControl】

 

选择MyFirstCtrl,这里我们没有手动注册,其实是VS2010在生成ocx的时候就已经注册好了

 

 

 然后点击【ok】按钮,如下

 

 中间没跳出什么异常,显示上图画面,说明我们的ocx创建成功了(当然使用的是默认的,什么都没有)

 

下面我们在Ocx中添加一些图形控件用于显示和操作,首先,插入一个对话框资源

 

 生成一个IDD_DIALOG1,然后修改对话框属性:Border改为None,Control改为True,Style改为Child,Visible改为True, 然后双击该对话框,生成一个与之关联的类,这里起名CActiveXTestDlg

 

 

 点击【Finish】。

 

在MyFirstActiveCtrl.h中添加如下代码:

 

 

 

用Class Wizard为CMyFirstActiveCtrl类添加OnCreate函数

 

 在MyFirstActiveCtrl.h中自动生成如下代码

 

 

  在MyFirstActiveCtrl.cpp中自动生成如下代码

 

 然后,在该函数中创建对话框的对象

复制代码
int CMyFirstActiveCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  Add your specialized creation code here
    m_ActiveXTestDlg.Create(IDD_DIALOG1, this);

    return 0;
}
复制代码

编译,用外部工具加载ocx(前面已讲),结果如下(如果看不到对话框,可以把矩形框拉大就可以看到了)

 

 这样带界面的ocx就生成了,另外可以在CActiveXTestDlg类中加入【ok】按钮响应函数

void CActiveXTestDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    //CDialogEx::OnOK();

    AfxMessageBox(_T("ActiveX test is ok!"));
}

这样,在测试程序中点击【ok】按钮,就会弹出如下对话框

 

备注:如果想要修改初始的ActiveX控件大小,可以在CMyFirstActiveCtrl构造函数中调用 SetInitialSize(   470,  295   );  来设置

 

ActiveX控件跟踪调试:

运行TstCon.exe,然后用ocx的工程Attach到该exe,就可以调试了。

posted on   wu.g.q  阅读(1532)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示