您的位置:首页 > 编程语言 > C语言/C++

COM组件开发(四)——VC++调用COM组件的方法

2015-02-16 15:15 253 查看

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进行检测从而判断错误。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  activex COM组件 VC++