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, ®ID);
そして、クライアントの呼び出しを待ちます。クライアントでは、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 インターフェイスの要件を受け取ります。