1

proxy\stub私は、いくつかのexeファイルとメカニズムを介して機能にアクセスするクライアントで、プロセス外comサーバーを作成しようとしています。私は自分の .idl ファイルを持っています:

[
    object,
    uuid(eaa27f4f-ad6b-4a52-90f3-6028507751a1),
    dual,
    nonextensible,
    helpstring("IConfig Interface"),
    pointer_default(unique)
]
interface IInterractionInterface : IDispatch
{
    [id(1), helpstring("Testing function")] HRESULT Test([in] long param);
};


[
    uuid(6fde5037-3034-4ae1-8aa7-2ad45e5716e4),
    version(1.0),
    helpstring("Some lib")
]
library SomeLib
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        uuid(86feabe4-a0a7-45b5-bcd4-f4f7085d6b1f),
        helpstring("Some lib")
    ]
    coclass Interraction
    {
        [default] interface IInterractionInterface;
    };
}

midl コンパイラ _p.c、_i.c ファイルを使用して生成され、.def を使用して proxy\stub dll を作成しました。

LIBRARY        proxy_stub.dll
DESCRIPTION    'generic proxy/stub DLL'
EXPORTS        DllGetClassObject      @1 PRIVATE
               DllCanUnloadNow        @2 PRIVATE
               DllRegisterServer      @4 PRIVATE
               DllUnregisterServer    @5 PRIVATE

次に、 を使用してこの dll を登録しregsrv32、win レジストリにこれを持っています。 ここに画像の説明を入力

私のサーバーでは、工場を作成しています:

CoRegisterClassObject(CLSID_InterractionInterfaceFactory, (IClassFactory*) &factory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &regID);

そして、クライアントの呼び出しを待ちます。クライアントでは、CreateInstance を使用して工場を呼び出しています。

result = CoGetClassObject(CLSID_InterractionInterfaceFactory, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void**)&factory);

if (S_OK == result)
{
    IInterractionInterface* iface = NULL;

    result = factory->CreateInstance(NULL, IID_InterractionInterface, (void**)&iface);
    if (S_OK == result)
    {

    }
}

クライアントは null iface を受け取り、結果はE_UNEXPECTEDになりますが、ファクトリでは正常に作成され、Factory:: から S_OK が返されCreateInstance()ます。PS メカニズムが私の .dll を使用しているかどうかわかりませんか? 多分私はいくつかのステップを忘れましたか?オブジェクトがプロセス境界を通過できないのはなぜですか?

編集: クライアントコードを置き換えようとしましたが、現在は次のようになっています:

result = CoCreateInstance(CLSID_InterractionInterfaceFactory, NULL, CLSCTX_LOCAL_SERVER, IID_InterractionInterface, (void**)&iface);
iface->Test(1);

そして、Test(1) を呼び出そうとすると、これが純粋な仮想関数であるというエラーがスローされます。そして、CreateInstance のファクトリでは、Unkoown インターフェイスの要件を受け取ります。

4

1 に答える 1

2

libraryプロキシ/スタブ DLL を使用する場合は、ブロックの外側でインターフェイスを定義します。の外部で定義されたものだけがlibrary、プロキシ/スタブ DLL 用に生成されたコードに入ります。libraryブロック内で定義または参照されたものは、生成されたタイプ ライブラリに入ります。典型的な IDL ファイルは、 の外部でインターフェイスを定義しlibrary、内部でそれらをcoclassブロックで記述します。このように、インターフェイス定義はプロキシ/スタブと TLB の両方で終了し、最大限の柔軟性が得られます。

あなたのインターフェースは自動化と互換性があります(まあ、ほとんど; パラメータタイプを int から long に変更してください)。この場合、タイプ ライブラリに基づく、いわゆる「ユニバーサル」マーシャリングを使用することをお勧めします。MIDL で生成された TLB ファイルをregtlibツールに登録するか、プログラムで.NET に登録するだけでLoadTypeLibEx、マーシャリングがサポートされます。

于 2013-08-03T13:21:04.190 に答える