1. 程式人生 > >COM元件開發(四)——VC++呼叫COM元件的方法

COM元件開發(四)——VC++呼叫COM元件的方法

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進行檢測從而判斷錯誤。