我正在尝试在一些 exe 文件和客户端中创建进程外 com 服务器,它将通过proxy\stub
机制访问功能。我有我的 .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 创建代理\存根 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 的工厂中,我收到了 Unkonown 接口的要求。