當前位置:
首頁 > 最新 > 軟體開發編寫COM進程外組件

軟體開發編寫COM進程外組件

相比進程內組件,進程外組件的編寫較為麻煩,在前面已經講的IDL和進程外組件原理基礎上,本節以一個簡單實例講解進程外組件的編寫步驟和注意事項。

1.IDL生成代理/存根

假如我們需要實現一個貓貓翻譯的介面,傳入人類語言,然後貓貓翻譯出指定的喵星語

這裡採用兩種字元串,WCHAR都是調用方分配內存,BSTR在組件中分配內存在客戶端釋放,這個後續再說明。

這裡採用VS2008,直接建立一個工程,添加IDL文件,

工程配置如下

編譯選項添加REGISTER_PROXY_DLL,以支持自註冊

鏈接選項引入需要的lib

注意鏈接選項中IDL的相關設置,一般採用默認如下

然後編譯,會自動生成相關文件,手動添加這些生成的文件到工程中,如下:

cat_h.h中包含了介面定義,cat_i.c包含了介面IID,cat_p.c為列集數據,dlldata.c為標準com導出函數實現,我們主要關注前兩個文件

符合我們的要求

此時編譯工程,就可以得到介面的代理/存根 dll,然後運行regsvr32.exe註冊即可。

查看註冊表,可以看到介面指向了代理程序的位置

注意,本文主要是為了講清楚進程外組件的構成,在實際ATL工程中,上述過程已經自動完成,只需要參考本文編寫IDL和進程外組件實現代碼即可。

2.組件程序實現代碼

進程外組件是exe,有了上面生成的介面定義,和進程內組件一樣,直接集成實現即可,如下

標準的IUnknown實現都和之前一樣,沒什麼差別,翻譯的過程採用查表的方式,查詢成功返回S_OK,失敗返回E_FAIL

注意這裡的BSTR方式傳遞的參數,需要使用SysAllocString分配內存,來保證跨進程傳遞。同理如果是其他指針數據,需要組件分配的內存給客戶使用的話,要使用CoTaskMem...系列函數來保證跨進程分配釋放內存

再就是組件外程序為了保證介面釋放前,組件生命周期一直在,採用的消息隊列循環,這裡組件對象釋放時,需要檢查當前整個dll能否被釋放,總的開關是控制在組件的工廠對象手中,這個稍後講解。

3.組件程序註冊代碼

和進程內dll組件自註冊機制不同,進程外組件需要自己識別進程命令行參數來註冊

進程參數為RegServer和UnregServer時,代表註冊和反註冊,參數為Embedding時表示是客戶調用組件。註冊時需要手動輸入命令行,客戶調用組件時會自動加上Embedding參數。

對應的註冊表如下

4.組件類廠實現

標準實現否和進程內組件一樣,實現IUnkown介面,CreateInstance中創建返回指定介面指針。

不同的是:

a.類廠註冊

進程外組件調用CreateInstance中CoGetClassObject中,會連接請求工廠對象,此時組件中需要將當前工廠對象指針註冊到COM中,COM會將指針列集傳送給客戶,客戶散集後創建對應的類廠對象代理,建立類廠代理/存根連接後,才進行下一步創建介面操作

進程外組件退出時需要反註冊。

5.進程外組件調用

唯一不同的是注意CoCreateInstance時傳入CLSCTX_LOCAL_SERVER,指明當前連接的是進程外組件。

還需要注意對於BSTR是組件分配內存,客戶調用SysFreeString釋放內存,注意對應。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 麥特賽爾軟體 的精彩文章:

Finance升級指導
大禮包來襲!手慢無!你只要說出你的想法就可以啦
乾貨帖——WINFORM常用控制項
VisualStudio插件開發
人有人的語言,動物有動物的語言,電腦有程序的語言

TAG:麥特賽爾軟體 |