2

私はCOMに比較的慣れていないので、これがばかげた質問である場合はお詫びします。一連のCOMインターフェイスをタイプライブラリAにコンパイルしています。このタイプライブラリは、私のソリューションのDLLの1つ( a.dll )のリソースです。別のDLL(b.dll )に入る別のタイプライブラリ(B )で、タイプライブラリAのインターフェイスを実装するコクラスを定義したいと思います。私が考えていることの簡単な例として、以下のIDLコードを参照してください。

import "oaidl.idl";
import "ocidl.idl";

// Import IMyInterface, which is part of MyLibA.tlb
import "MyInterface.idl";

[
    uuid(E80492A8-1E8C-4ABF-B4DE-9C252C445AFE),
    version(1.0),
    helpstring("MyLibB Type Library")
]
library MyLibB
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");
    importlib("MyLibA.tlb); 

    [
        uuid(25E3CD5E-FA06-4845-BE3E-F260985AFB20),
        helpstring("My CoClass")
    ]
    coclass MyCoClass
    {
         [default] interface IMyInterface;
    };
};

上記をコンパイルできますが、MIDLによって生成されたtlbファイルをoleviewで開くと、エラーメッセージが表示されますTYPE_E_CANTLOADLIBRARY。やりたいことができないのではないかと思い始めています。これまでの私の実験では、タイプライブラリには、コクラス定義自体とともに、コクラスが実装するすべてのインターフェイスが含まれている必要があることが示唆されています。これは本当ですか?

ステートメントを削除するとimportlib("MyLibA.tlb);、コンパイルされたtlbファイルをエラーなしでoleviewで表示できますが、MyLibB.tlbはインターフェイスの定義も含まれていIMyInterfaceます。つまり、インターフェイスは両方のタイプライブラリで2回定義されています。私のアプリケーションでは、登録不要のCOMを使用してa.dllb.dllの両方をロードするため、これは必要ありません。このシナリオでは、複数のタイプライブラリで同じインターフェイス定義が検出されると、アクティベーションコンテキストの生成が失敗します。

別々のタイプライブラリで目的のインターフェイスとコクラスの分離を実現する方法についての提案はありますか?

4

1 に答える 1

3

OLE / COMビューアに表示される場合、TYPE_E_CANTLOADLIBRARYこれは通常、開いているTLBから参照されている別のTLBが正しく登録されていないことを意味します。

修正は、依存関係TLB(この場合はMyLibA.tlb)を、システムに応じて、または代替regtlbのツールに登録することです。regtlib

質問は登録不要のCOMのコンテキストで行われるため、インターフェイスインスタンスのマーシャリングに関して発生する可能性のある問題に注意する必要があります。通常、標準のマーシャラーを使用するには、TLBを登録する必要があります。それ以外の場合は、ここに記載されているように、マニフェストでマーシャリング情報を適切に宣言する必要があります

于 2013-03-11T16:48:38.483 に答える