2016-08-14 22 views
1

C++でサードパーティ製のインターフェイスを実装するプラグインを作成しています。私はMSVSでATLプロジェクトを作成し、ATLシンプルオブジェクトを追加して、そのクラスの "Implement Interface"ショートカットを使用しました。すべてのインタフェースメソッドがスタブになってビルドされます。私も追加:C++でのCOMインターフェイスの実装、公開されていないメソッド

[assembly:System::Runtime::InteropServices::ComVisible(true)]; 

、これらは、ビルド後(成功した)を実行している:

regsvr32.exe VWorksCPPATL.dll 
regasm /codebase /tlb VWorksCPPATL.dll 

しかし、私はOLEVIEWでDLLを開くと、私はインターフェイスのメソッドのいずれかが露出表示されていないが(以外はIUnknown)、DLLはプラグインのコンテナによってロードされません。

私がC#で書いた作業用のDLLを開くと、実装したインターフェイスとそのメソッドがコクラスの下に表示されます。 (私は "COMの相互運用機能のための登録"と "アセンブリのCOM可視"属性をプロジェクトに設定していました)

ベンダー(プラグインコンテナの作成者)がC++で書いた作業DLLを開くと、すべてのDLLではなく一部のDLLのメソッド/インターフェイスを公開しています。

IDLファイルを手動で変更してこれらの方法を公開する必要がありますか?今すぐ表示(属性省略):

interface IPF400 : IDispatch{} 
library VWorksCPPATLIB{ 
    coclass PF400{ 
     [default] interface IPF400; 
    } 
} 

...または他の理由で私はおそらく問題がありますか?

+0

COM/OLEビューアーでは、空のタイプライブラリまたはタイプライブラリが一切表示されませんか?一時的なビルドファイルの中で生成された.TLBファイルに必要なものが表示されますか? –

+0

一時TLBと埋め込みTLBは同じです。含まれるのはIDispatchメンバー(GetTypeInfoCountなど)です。貼り付け:https://gist.github.com/zbjornson/8805c2e85b3d70dd2248dd387fbcf231。私はIDLファイルを変更して他のインターフェースを実装していると言いますが、それを自動的に行う方法があることを願っています。 – ZachB

+0

いいですね。 'IPF400'はそこにあります。あなたのIDL 'IPF400'も空で、コンパイルされたTLBに表示されます。 @RomanR。 –

答えて

1

さてさて、私は手動でファイルをIDLにimportlib("....tlb")interface IFooInterfaceを追加し、私は実装していますインターフェースが含まれているDLLからTLBをエクスポートするthis answerの手順に従っていた(属性は省略):

interface IPF400 : IDispatch{ 
}; 

library VWorksCPPATLLib 
{ 
    importlib("stdole2.tlb"); 
    importlib("IWorksDriver.tlb"); // <-- Added 

    coclass PF400 
    { 
     interface IControllerClient; // <-- Added 
     [default] interface IPF400; 
    }; 

}; 
関連する問題