COM學習筆記7_跨進程COM組件

由於內存不能跨進程訪問,所以訪問exe中的COM組件需要額外處理

1.跨進程調用函數 : 可以通過LPC (本地過程調用) 實現

2.參數傳遞 : 通過"調整",若在同一機器上,需要拷貝參數,若在遠端,還需要考慮機器數據表示方面的不同。
調整 :將函數調用的參數從一個進程地址空間傳到另一個進程地址空間

參數的調整可以通過IMarshal接口實現
LPC通過代理/殘根調整參數
可以通過IDL描述接口,再通過MIDL編譯生成代理和殘根DLL。

IDL的一個示例:

 

其中import 用於包含其他idl文件,相當於include

[]爲信息分隔符;
在每一接口前都有一個屬性列表,也叫接口頭
接口頭中
object 表示接口是一個COM接口,這類接口返回值爲HRESULT類型,可幫助指定網絡錯誤 (這是微軟對IDL的一個擴展)
uuid 爲接口對應的IID
helpstring 放入一個幫助字符串
pointer_default 告訴MIDL如何處理指針。
    ref : 把指針當作引用對待 (指針不能爲空,總是指向合法地址,調整前後指向同一內存地址)
    unique : 指針可爲空,函數內可修改其值,不能指定別名
    ptr : 這是一個C指針,可爲空,函數內可修改其值,可指定別名

參數中in, out 代表參數傳遞方向,可幫助MIDL優化。out參數必須是指針
string 代表參數是一個字符串指針,可通過查找末尾的空字符確定長度
size_is 指定指針參數指向內容的大小
IDL 也可以傳遞複雜的參數,例如上面的Point3d
由於MIDL需要精確知道參數指針指向什麼內容,所以不要使用void*作爲參數
若要傳遞接口指針,可以這樣 :
HRESULT GetIface ([in] const IID& iid, [out, iid_is(iid)] IUnknown **ppI);

propput和propget將COM函數說明爲一個屬性,C++會自動加上get_和pub_前綴

library 代表要生成一個類型庫

發佈了59 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章