2

私は CLR のホスティングを試しています (今のところモノを使用しようとはしていませんが、おそらく試してみます)。基本的に、私はこれに従っています:

http://www.lenholgate.com/blog/2010/07/clr-hosting---a-flexible-managed-plugin-system-part-1.html

ただし、その記事では十分に説明されていないため、COM 自体に問題があり、(COM で遊んだことはありません) 学習しながら学習しています。

インターフェイスを定義しました:

import "unknwn.idl";
[
    object,
    uuid(55d96f88-9633-4ad7-b9de-1a546ea73307),
    helpstring("INative interface"),
    pointer_default(unique)
]
interface INative : IUnknown
{
    HRESULT Write(BSTR s);
}
[
   object,
   uuid(74eeeaaa-d73c-436e-b52d-5c8a972ce60a),
   helpstring("ITestManager Interface"),
   pointer_default(unique)
]
interface IManagedHost : IUnknown
{
    HRESULT Init(INative* native);
}

そして生成されたファイルを私のネイティブプロジェクトに含めました。ただし、リンカーが解決できないため、実行可能ファイルをビルドできません: _CStdStubBuffer_Release@4. はRpcRT4.libリンクされていますが、実行dumpbin rpcrt4.lib /all | grep _CStdStubBuffer_Releaseしましたが、そのライブラリによってエクスポートされたようなものはありませんCStdStubBuffer_DebugServerRelease。それで、問題は、そのメソッドが存在しないと思われる場合、そのメソッドを正確に参照するものは何ですか?

さらに調査を行ったところ、このメソッドは IDL ツールによって生成された .c ファイルを介して参照されていることがわかりました。

const CInterfaceStubVtbl _INativeStubVtbl =
{
    &IID_INative,
    &INative_ServerInfo,
    4,
    0, /* pure interpreted */
    CStdStubBuffer_METHODS
};

および CStdStubBuffer_METHODS はRpcProxy.h、Windows SDK で定義されていますv7.0A

#define CStdStubBuffer_METHODS \
    CStdStubBuffer_QueryInterface,\
    CStdStubBuffer_AddRef, \
    CStdStubBuffer_Release, \
    CStdStubBuffer_Connect, \
    CStdStubBuffer_Disconnect, \
    CStdStubBuffer_Invoke, \
    CStdStubBuffer_IsIIDSupported, \
    CStdStubBuffer_CountRefs, \
    CStdStubBuffer_DebugServerQueryInterface, \
    CStdStubBuffer_DebugServerRelease

実際には CStdStubBuffer_Release メソッドが必要ですが、http://msdn.microsoft.com/en-us/library/windows/desktop/ms764247%28v=VS.85%29.aspxとは少し異なります。

次に、他のどのライブラリをリンクする必要がありますか?

4

1 に答える 1

3

CStdStubBuffer_Release() は、midl.exe、dlldata.c によって自動生成される別のファイルによって実装されます。DLLDATA_ROUTINES マクロが生成します。

この問題は、プロジェクトの構成ミスを指しています。プロキシ .c ファイルをプロキシ/スタブ プロジェクトで使用するのではなく、メイン プロジェクトに追加したようです。また、dlldata.c を消費します。カスタム CLR ホストではプロキシ/スタブは必要ないと確信しているので、単に .c ファイルを削除してください。

于 2011-11-27T16:41:39.127 に答える