5

C# インプロセス サーバーを作成しようとしていますsbtsv.idl(これは Windows 8 SDK に含まれています)。私が見つけたほとんどすべての指示ではMIDL.tlbファイルtlbimportを作成してからプロキシ dll を作成するように指示されています。

ただし、IDL にセクションが含まれていない場合、libraryファイル.tlb生成されず、セクションは含まれsbtsv.idlませんlibrary

ライブラリ内に作成したいインターフェースを宣言したIDLファイルを自作してみた

#include "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\sbtsv.idl"

[uuid(43250D0C-BBC6-4109-BCD2-6F61F0D3B611)]
library sbtsvClientLib
{
    interface ITsSbResourceNotification;
};

ただし、実行しようとするとMIDL、次のエラーが発生します

Microsoft (R) 32b/64b MIDL コンパイラ バージョン 8.00.0603  
Copyright (c) Microsoft Corporation. 全著作権所有。  
.\sbtsvClientLib.idl を処理中  
sbtsvClientLib.idl  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.idl  
oaidl.idl  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\um\objidl.idl  
objidl.idl  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\um\unknwn.idl  
unknwn.idl  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypes.idl  
wtypes.idl  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypesbase.idl  
wtypesbase.idl  
C:\Program Files (x86)\Windows Kits\8.1\include\shared\basetsd.h を処理中  
basetsd.h  
C:\Program Files (x86)\Windows Kits\8.1\include\shared\guiddef.h の処理中  
guiddef.h  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\um\SessdirPublicTypes.idl  
SessdirPublicTypes.idl  
処理中 C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.acf  
oaidl.acf  
midl\oleaut32.dll: エラー MIDL2020: タイプ ライブラリの生成エラー: SetFuncAndParamNames に失敗しました: put_State (0x8002802C)

クラスとインターフェースを手作業で書かなければならないと思っていますが、これが機能するのに何か間違ったことをしていないかどうかを確認したかったのです。

4

1 に答える 1

12

COMには2種類あります。元の種類は 90 年代初頭にさかのぼり、C または C++ で相互運用を機能させることを目的としており、Microsoft の Office グループによって考案されました。後の種類の COM のサブセットは、もともと OLE オートメーションと呼ばれていました。DevDiv グループの Visual Basic チームが、Visual Basic の初期バージョンの 16 ビット拡張モデルである VBX の代替を探していたときに開発されました。後に、マーケティング用語として ActiveX に名前が変更されました。安全でないことで多くの悪評を得て、名前をプレーンな COM に戻しました。

自動化は、VB の使用を超えて非常に成功しており、Windows のどの言語ランタイムもサポートしています。実装が簡単な COM の厳密なサブセットを実装することで、大幅に支援されました。また、タイプ ライブラリをサポートするために、言語に依存しない方法でコンパイラに宣言を認識させます。

それは、まだ Windows で非常に頻繁に使用されている「古い」COM に取って代わるものではありませんでした。多くの API は「古い」スタイルです。自動化されていない種類の標準のバット シグナルは、IDL ファイルで "cppquote" を参照しています。または、IDispatch ではなく IUnknown から派生するインターフェイス。または、SAFEARRAY の代わりに raw 配列を使用するメソッド。または、C または C++ コンパイラのみが読み取ることができる種類の、Windows SDK ヘッダーに由来する構造体型。

sbtsv.idl に表示されるすべてのもの。

MIDL には、オートメーションの制限に関する実際の知識はありません。IDL をコンパイルし、oleauto32 の ICreateTypeInfo インターフェイス メソッドをぶっきらぼうに呼び出すだけです。タイプライブラリ形式がサポートしていない場合、これは簡単に反対できます。エラーメッセージは最悪です。どの宣言が間違っていたのか正確にはわかりません。MIDL、または一般的な Windows SDK ツールでは珍しいことではありませんが、診断はその強みではありません。DevDiv は使いやすいツールを作成します。

それ以外の場合は、sbtsv.idl でどの宣言が間違っているかを推測する必要はありません。それらすべてについて。[ComImport] 宣言を自分で書くという、本当に難しい方法でこれを行う必要があります。面倒でエラーが発生しやすいため、代わりに C++/CLI ラッパーを検討してください。

于 2013-11-01T02:04:48.530 に答える