ActiveX 控件
对于ActiveX控件,可以在Visual Studio中使用ClassWizard的方法引入,在MFC项目中选择菜单“项目”——> “添加类”——>“ActiveX控件中的MFC类”,然后可以分别从注册表和文件两种方式中选择自己想要的组件。选择注册表中的方式获取的都是在本系统中注册了的组件,而文件则是从磁盘目录下获取COM组件。
如果想为现有程序添加对ActiveX控件的支持,可以在应用程序的InitInstance函数中添加:
AfxEnableControlContainer
并在staafx.h中添加:
#include <afxdisp.h>
代码组件
这类组件就是普通的没有界面的COM组件,需要再客户端程序的代码中进行引入。一般有如下几种方法:
1. 使用MFC OLE 的ClassWizard:
在MFC项目的应用程序类(*APP)中的InitInstance中添加
AfxOleInit();
然后,选择菜单“项目”——> “添加类”——>“TypeLib中的MFC类”
选择自己想要的类型库,点击“完成”后会创建自己对应类型库的组件包装类,然后在代码中调用组件包装类类对象的CreateDispatch和ReleaseDispatch来创建和销毁对象。
2.使用COM库函数
在应用程序类的InitInstance函数的开始和结束处分别添加:
BOOL CSampleApp::InitInstance() { CoInitialize(NULL);
...
CoUninitialize(); return FALSE; }
然后,在对话框类中包含组件的头文件:
#include "COMSample.h"
#include "COMSample_i.c"
在对话框类中定义:
protected: ISample* pSample;
之后,在对话框类的OnInitDialog中创建COM对象:
pSample = NULL; HRESULT hr = CoCreateInstance(CLSID_Sample, NULL , CLSCTX_INPROC_SERVER, IID_ISample, reinterpret_cast<void*>(&pSample));
其中,CoCreateInstance第一个和第四个参数分别是类ID和接口ID,需要从COMSample_i.c中查找,所以当接口比较多的时候是比较麻烦的。
最后,在OnClose中释放COM对象:
if(pSample != NULL) pSample->Release();
3.使用import指令
使用import可以对类型库文件、exe、dll进行类型导入,从而读出组件的类型信息并创建接口的包装类。
import指令:
#import "COMSample.tlb"
或者:
#import "COMSample.dll"
另外,可以把组件的命名空间带入,在import指令的最后添加:no_namespace
然后会自动生成跟类型库同名的两个后缀分别是“TLI”和“TLH”的文件,其中TLH文件中包含了对组件每个接口的智能指针的定义,所以可以使用下面的方式使用组件:
ISamplePtr iSamplePtr(__uuidof(Sample));
或者:
ISamplePtr iSamplePtr = NULL; HRESULT hr = S_OK; hr = iSamplePtr.CreateInstance(__uuidof(Sample));
其中,第二种方法可以对hr进行检测从而判断错误。