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

时间:2021-10-08 23:20:14

ActiveX 控件

         对于ActiveX控件,可以在Visual Studio中使用ClassWizard的方法引入,在MFC项目中选择菜单“项目”——> “添加类”——>“ActiveX控件中的MFC类”,然后可以分别从注册表和文件两种方式中选择自己想要的组件。选择注册表中的方式获取的都是在本系统中注册了的组件,而文件则是从磁盘目录下获取COM组件。


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

         如果想为现有程序添加对ActiveX控件的支持,可以在应用程序的InitInstance函数中添加:

    AfxEnableControlContainer

         并在staafx.h中添加:

    #include <afxdisp.h>

代码组件

            这类组件就是普通的没有界面的COM组件,需要再客户端程序的代码中进行引入。一般有如下几种方法:

 

           1. 使用MFC OLE 的ClassWizard:

           在MFC项目的应用程序类(*APP)中的InitInstance中添加

      AfxOleInit();

           然后,选择菜单“项目”——> “添加类”——>“TypeLib中的MFC类”

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

            选择自己想要的类型库,点击“完成”后会创建自己对应类型库的组件包装类,然后在代码中调用组件包装类类对象的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进行检测从而判断错误。