我強烈建議您創建一個IDL file至design your COM interfaces。
鑑於你的答案你的榜樣,一個相當最小的IDL文件可能是這樣的:
import "oaidl.idl";
[object,
uuid(1f6efffc-0ac7-3221-8175-5272a09cea82),
dual,
oleautomation]
interface IStreamFrame : IDispatch {
[propget]
HRESULT Width([out, retval] long *pWidth);
[propget]
HRESULT Height([out, retval] long *pHeight);
[propget]
HRESULT Buffer([out, retval] SAFEARRAY(byte) *pBuffer);
};
[uuid(1f6efffc-0ac7-3221-8175-5272a09cea83)]
library ContosoStreamFrame {
importlib("stdole32.tlb");
interface IStreamFrame;
};
您再使用midl.exe
生成帶有C/C++接口.H,爲CLSID一個_i.c和用於C/C++鏈接的IID常量,用於RPC註冊的dlldata.c,用代理和存根編組的東西的_p.c以及通常稱爲.idl文件的解析表示的.tlb。這在documentation中描述得更好。
編輯:似乎有no way to avoid the C/C++ file generation。
EDIT2:我剛發現一個解決方法,使用nul
作爲你不想要的輸出文件。例如,下面的命令只產生file.tlb
:
midl.exe /header nul /iid nul /proxy nul /dlldata nul file.idl
注:如果並不意味着你IStreamFrame
接口跨進程使用,該local
屬性添加到該接口。
在C/C++中,可以使用生成的特定文件或0123B的TLB文件。在.NET中,您可以在生成.NET程序集的TLB文件上運行tlbimp.exe
。
如果您的項目是以.NET爲中心的,那麼也可以使用tlbexp.exe
。但是,這將需要您瞭解.NET COM註釋以及它們在IDL方面的含義,因此我不確定是否有任何好處以另一種語言保存一個額外的源文件,而犧牲許多裝飾界面和類定義中的噪聲。如果你想在源代碼級別完全控制類和接口,並且希望儘可能簡化.NET代碼(可讀性,可用性和速度的優化),那麼這可能是一個不錯的選擇。
最後,您可以通過創建項目來自動完成Visual Studio中的所有操作。如果使用IDL方法,請添加一個自定義構建步驟,該步驟調用midl.exe
和tlbimp.exe
,並使相關項目依賴於此項目以獲得正確的構建順序。如果您使用.NET方法,請添加一個自定義構建步驟,調用tlbexp.exe
並使相關的C/C++項目依賴於此項目。
編輯:如果您不需要從midl.exe
生成的C/C++文件,您可以將del
命令添加到特定輸出文件的自定義生成步驟。
EDIT2:或使用上述的nul
解決方法。
當類型庫已經存在時,常用的方法是使用Visual Studio將其導入到.NET中。但是,這樣,如果更新IDL文件,則必須記住重新生成TLB並再次導入它。
你需要刪除* ref *關鍵字,所以你不通過SAFEARRAY **,休息應該是好的。普通字節[]和傳遞數組大小的額外參數也可以起作用並節省開銷。 –