前言
“元件對象模型(英語:Component Object Model,縮寫COM)是微軟的一套軟體元件的二進制接口标準。這使得跨程式設計語言的程序間通信、動态對象建立成為可能。”
以上是維基百科對COM元件的定義,簡單來說,C++編寫的COM元件可以在C#、Delphi語言中使用,COM元件可以實作跨語言的操作,在COM中也分程序間和程序外通信,COM/DCOM 元件可以在DLL 或EXE 文檔中實作。
一、在 DLL 中實作的COM/DCOM元件稱為 In-Process Server,因為這些元件是加載到使用它們的用戶端應用程式執行程式記憶體之中。是以當應用程式調用COM/DCOM 元件的服務時,就和一般的程式或函數調用一樣,非常快速。
二、在EXE 中實作的COM/DCOM元件是執行在它自己的執行程式之中,是以這種 COM/DCOM元件稱為Out-Process Server。當用戶端應用程式調用在獨立的執行程式中的 COM/DCOM 元件時必須穿越不同的執行程式,因為 Out-Process Server 在執行時會比In-Process Server 慢許多。
工作過程中,遇到一個32位的DLL檔案,需要在64位環境下使用,是以使用制作com元件的方式,供64位環境調用。
使用C++制作COM元件,在visual studio2013環境下:
1、建立活動模闆庫(ATL)項目:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn1UNBpXTxUERPpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5kDN2IjNzUTMyEjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
活動模闆庫項目對COM元件進行了封裝,使我們可以更友善的制作COM元件,不用關心太多的細節實作。
2、選擇COM元件的程式類型
建立項目後,在彈出的頁面中選擇下一步,這裡可以選擇生成DLL檔案或者是EXE檔案,我們以DLL檔案為例
注:在需要程序外通信的情況下,在這裡就需要選擇EXE的形式。
(在我遇到的問題中,需要在64位環境中使用COM元件,并且COM元件引用了32位dll時,就用程序外通信或服務的方式,dll或exe的COM元件制作流程相同,我們以dll為例)
3、添加ATL簡單對象
右鍵項目,選擇添加類,在彈出的頁面中選擇添加
在彈出的視窗中填寫C++類中和COM元件類中的名稱,ProgID一般填寫為前項項目名稱,後項類名稱
4、為IHandler接口添加方法
打開類視圖,右鍵IHandler類添加方法
我們添加一個Greeting方法,傳入name,輸出問好語句
添加完成後,在ComServer.idl中會多出一個Greeting方法,這是方法向導為我們自動生成的。
[
object,
uuid(36C32285-5BBF-4D04-8B8C-567CD817BD70),
dual,
nonextensible,
pointer_default(unique)
]
interface IHandler : IDispatch{
[id(1)] HRESULT Greeting([in] BSTR Name, [out, retval] BYTE* message);
};
另外,在Handler.h和Handler.cpp中也會添加這個方法的聲明和函數體
5、實作com元件中聲明的方法
在Handler.cpp中,方法實作如下:
// Handler.cpp : CHandler 的實作
#include "stdafx.h"
#include "Handler.h"
// CHandler
STDMETHODIMP CHandler::Greeting(BSTR name, BSTR* message)
{
// TODO: 在此添加實作代碼
CComBSTR tmp("welcome,");
tmp.Append(name);
*message = tmp;
return S_OK;
}
方法實作後,右鍵項目生成解決方案即可。生成解決方案後,會生成ComServer.dll,并将這個dll注冊到系統資料庫中,可以在系統資料庫中,進行檢視:
在計算機\HKEY_CLASSES_ROOT目錄下,可以找到我們定義的progID,就說明COM元件已經注冊成功了
在這裡還可以看到我們注冊COM元件的CLSID。
注:在使用生成解決方案注冊com元件的時候失敗時,需要以管理者方式運作visual studio,在某些情況下,visual studio的權限不能夠操作系統資料庫。
手動注冊com元件
生成解決方案無法注冊時,我們可以使用手動注冊com元件的方式,操作為:
首先,打開指令号,并定位到dll檔案所在的位置。
使用regsvr32的指令,對dll檔案進行注冊,如下圖:
注冊成功後,可以在系統資料庫中進行檢查。
到目前為止,制作com元件并注冊的過程已經完成了,下一篇會寫到如何在其他項目中應用com元件。