假设需求如下:底层是一个数学运算库DLL,中间是ActiveX控件(它调用底层的数学运算库DLL来完成控制层),界面层在测试时可以是一个exe程序,最后发布到IE浏览器上测试。

 

数学运算库DLL的开发

      新建一个Win32 DLL项目,加入一个头文件MyNum.h,在其中声明所有的数学函数(为简单起见,本文只考虑加法运算),代码如下:

COM组件开发实践(二)#ifndef MY_NUM_H
COM组件开发实践(二)
#define MY_NUM_H
COM组件开发实践(二)
int __stdcall AddNum(int,int);
COM组件开发实践(二)
#endif
COM组件开发实践(二)

请注意这里的方法声明为__stdcall,而VC++默认的是__cdecl,由于组件的语言无关性要求调用和被调双方必须在函数调用的约定上一致,因此在后面加载DLL并获取此方法时也要求和你的声明一致。

      为了简单起见,加法方法的实现就放倒DLL入口点所在文件,代码如下:

COM组件开发实践(二)// NumDLL.cpp : 定义DLL 应用程序的入口点。
COM组件开发实践(二)
//
COM组件开发实践(二)
#include "stdafx.h"
COM组件开发实践(二)#include 
"MyNum.h"
COM组件开发实践(二)
COM组件开发实践(二)#ifdef _MANAGED
COM组件开发实践(二)
#pragma managed(push, off)
COM组件开发实践(二)
#endif
COM组件开发实践(二)
COM组件开发实践(二)
int __stdcall AddNum(int Num1,int Num2)

      为了能在其他程序中显示链接此DLL,我们为它加入一个.def文件,命名为NumDLL.def,列出此DLL导出的方法名称:

COM组件开发实践(二)LIBRARY    "NumDLL"
COM组件开发实践(二)EXPORTS
COM组件开发实践(二)    AddNum
COM组件开发实践(二)

至此我们的数学运算函数库DLL就完成了。

ATL开发ActiveX控件

      开发ActiveX控件有两种方式,一是MFC,二是ATL,而后者是专门用于COM组件开发,因此更适合于ActiveX。因此这里选择后者,前者的开发示例参考我这篇文章(用VC++开发ActiveX 控件完全教程(一))。

      新建一个ATL项目,命名为”FuckATL”,接受默认设置。右键项目名,添加一个”ATL简单对象,命名为CaluNumCtrl点击下一步进入组件选项设置界面。

      修改类的头文件CaluNumCtrl.h如下:

COM组件开发实践(二)class ATL_NO_VTABLE CCaluNumCtrl :
COM组件开发实践(二)    
public CComObjectRootEx<CComSingleThreadModel>,
COM组件开发实践(二)    
public CComCoClass<CCaluNumCtrl, &CLSID_CaluNumCtrl>,
COM组件开发实践(二)    
public ISupportErrorInfo,
COM组件开发实践(二)    
public IConnectionPointContainerImpl<CCaluNumCtrl>,
COM组件开发实践(二)    
public CProxy_ICaluNumCtrlEvents<CCaluNumCtrl>,
COM组件开发实践(二)    
public IObjectWithSiteImpl<CCaluNumCtrl>,

在控件实现文件CaluNumCtrl.cpp中,代码如下:

COM组件开发实践(二)STDMETHODIMP CCaluNumCtrl::AddNumbers(LONG Num1, LONG Num2, LONG* ReturnVal)

     好了,ActiveX控件仅仅是简单地调用底层的数学运算库DLL来完成运算,下面我们写一个exe程序对这个COM组件进行测试。

一个控制台测试程序

      建立一个最简单的控制台程序来进行测试,代码如下:

COM组件开发实践(二)#include "..\..\FuckATL\FuckATL\FuckATL.h"
COM组件开发实践(二)#include 
"..\..\FuckATL\FuckATL\FuckATL_i.c"
COM组件开发实践(二)#include 
<iostream>
COM组件开发实践(二)
using  namespace std;
COM组件开发实践(二)
COM组件开发实践(二)
void main(void)

来到IE的世界

      最后我们将此ActiveX组件嵌入到html页面中,对其进行测试.新建一个html页面,代码如下:

COM组件开发实践(二)<HTML>
COM组件开发实践(二)
<HEAD>
COM组件开发实践(二)
<TITLE>New Page</TITLE>

     由于暂时先不考虑控件的安全性需要,因此会出现下面的警告信息,不过不要紧,这个问题以后再解决。

COM组件开发实践(二)

测试结果如下:

COM组件开发实践(二)

 

相关文章:

  • 2021-09-10
  • 2021-09-25
  • 2021-10-24
  • 2021-07-27
  • 2022-01-03
  • 2021-11-14
猜你喜欢
  • 2021-05-19
  • 2021-12-14
  • 2021-11-12
相关资源
相似解决方案