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