COMインターフェイスを設計するためにIDLファイルを作成することを強くお勧めします。
あなたの答えの例を考えると、かなり最小限の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、C / C ++リンク用のCLSIDおよびIID定数用の_i.c、RPC登録用のdlldata.c、プロキシおよびスタブマーシャリング関連のものを使用した_p.cを生成するために使用します。 .tlbは、一般的に.idlファイルの解析された表現です。これはすべて、ドキュメントで詳しく説明されています。
編集:C /C++ファイルの生成を回避する方法はないようです。
EDIT2:回避策を見つけました。不要nul
なものの出力ファイルとして使用してください。たとえば、次のコマンドは以下を生成するだけfile.tlb
です。
midl.exe /header nul /iid nul /proxy nul /dlldata nul file.idl
注:IStreamFrame
インターフェースがプロセス間で使用されることを意図していない場合は、インターフェースにlocal
属性を追加してください。
C / C ++では、生成された特定のファイル、または#import
TLBファイルを使用できます。tlbimp.exe
.NETでは、.NETアセンブリを生成するTLBファイルで実行できます。
tlbexp.exe
プロジェクトが.NET中心の場合にも使用できます。ただし、.NET COMアノテーションと、IDLに関してそれらが何を意味するかを知っておく必要があるため、多くの装飾を犠牲にして、1つの余分なソースファイルを別の言語で保存することにメリットがあるかどうかはわかりません。インターフェイスとクラス定義のノイズ。ソースレベルでクラスとインターフェイスを完全に制御し、.NETコードで可能な限り簡単に(読み取り、使いやすさ、場合によっては速度を最適化)したい場合は、おそらく良いオプションです。
最後に、プロジェクトを作成することにより、VisualStudioでこれらすべてを自動化できます。IDLアプローチを使用する場合は、カスタムビルドステップを追加しmidl.exe
てtlbimp.exe
、依存プロジェクトがこのプロジェクトに依存して正しいビルド順序になるようにします。.NETアプローチを使用する場合はtlbexp.exe
、依存するC /C++プロジェクトを呼び出してこのプロジェクトに依存させるカスタムビルドステップを追加します。
編集:から生成されたC / C ++ファイルが必要ない場合は、特定の出力ファイルのカスタムビルドステップにコマンドをmidl.exe
追加できます。del
EDIT2:または、nul
上記の回避策を使用してください。
タイプライブラリが既に存在する場合に使用される一般的なアプローチは、VisualStudioを使用してそれを.NETにインポートすることです。ただし、この方法では、IDLファイルを更新する場合は、TLBを再生成し、再度インポートすることを忘れないでください。