我正在尝试使用Windows RPC在两个进程(C / C ++,32位,Win7)之间进行通信。
我已经按照这里的示例Instruction to RPC成功地使RPC工作了。现在我也很难让代理/存根工作起作用。
IDL文件如下所示:
[ uuid(3cb112c0-688a-4611-83b6-31d33d87ea28), object ]
interface IDemo : IUnknown
{
HRESULT ThisIsAMethod([in, string] const char* test);
}
[ uuid(60ad6a21-ba49-483a-b0a2-faa5187b8299), version(1.0),
implicit_handle(handle_t hDemoBinding)]
interface IDemoRPC
{
void SimpleTest();
void GetDemo([out] IDemo** service);
void Shutdown();
}
我可以从客户端远程调用服务器上的SimpleTest()
。工作得很好。但是,GetDemo()
在服务器“返回”NULL
之外的其他内容时,会向我发出访问冲突。
这就是我所做的:
根据生成的demo_i.c,demo_p.c,dlldata.c构建DLL。设置REGISTER_PROXY_DLL
和包含五个私有条目的def文件。我已经用regsvr32
(来自WOW64的那个)注册了它。
在服务器进程中创建了一个DemoImpl
类,该类扩展了IDemo
并实现了ThisIsAMethod
以及AddRef
和朋友。
使用单行GetDemo(IDemo** service)
*service = new DemoImpl();
当我从客户端进程调用GetDemo
时,服务器进程以访问冲突(0x00000014)终止。堆栈跟踪显示它发生在rpcrt4内的一个单独的线程中。
我原以为该东西会将代理返回给客户端。
我怀疑我在这里做了一些根本错误的事情。首先,我找不到使用new
创建接口对象实例的示例。 CoGetClassObject
或其他什么东西都有些神奇。不知道这些函数应该如何知道在哪里找到实现。