C++ 进程外COM工厂CreateInstance返回意外的E_
我正在尝试使用factory创建COM对象的实例 我的服务器代码是:C++ 进程外COM工厂CreateInstance返回意外的E_,c++,com,C++,Com,我正在尝试使用factory创建COM对象的实例 我的服务器代码是: int main(int, char* argv[]) { HRESULT result = CoInitializeEx(NULL, COINIT_MULTITHREADED); Factory factory; DWORD regID = 0; result = CoRegisterClassObject(CLSID_InterractionInterfaceFactory, (IClas
int main(int, char* argv[])
{
HRESULT result = CoInitializeEx(NULL, COINIT_MULTITHREADED);
Factory factory;
DWORD regID = 0;
result = CoRegisterClassObject(CLSID_InterractionInterfaceFactory, (IClassFactory*) &factory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, ®ID);
MSG ms;
while(GetMessage(&ms, 0, 0, 0))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
CoRevokeClassObject(regID);
CoUninitialize();
return 0;
}
我的客户代码是:
int main(int, char*[])
{
HRESULT result;
result = CoInitialize(NULL);
IClassFactory* factory = NULL;
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);
**// HERE IT RETURNS E_UNEXPECTED**
}
CoUninitialize();
return 0;
}
我的QueryInterface方法:
STDMETHODIMP InterractionInterface::QueryInterface(REFIID riid, LPVOID FAR * ppv)
{
*ppv = NULL;
if (riid == IID_IUnknown)
{
*ppv = (IUnknown*)this;
}
if (riid == IID_InterractionInterface)
{
*ppv = (IInterractionInterface*)this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef() ;
return S_OK;
}
对象是在服务器端创建的,然后为了使其在客户端可用,必须成功封送
IInterractionInterface
接口。。。我想情况并非如此。罗曼,我该怎么做才能让这个对象对客户开放呢?我需要实现一些接口程序或其他东西?我不认为您是通过实现IMarshal
intreface来为interactioninterface
进行自定义封送处理,所以重要的是接口定义在哪里,类型库是否存在和注册,是否注册了代理/存根库等。您提供的代码片段没有回答这个问题。我已将我的接口添加到问题中。我不需要任何自定义编组。要实现proxy\stub机制,我必须做些什么?除了您之外,没有人知道您使用这种声明的接口。因此,无法进行封送处理以在客户端和已处理的服务器之间建立通信。因此,出现了错误。您需要将接口放入类型库中,类型库必须在system/registry中注册。然后,可以将标准封送应用于接口(应用其他约束)。
DEFINE_GUID(CLSID_InterractionInterfaceFactory, 0x84d55f4a, 0xff3c, 0x43b2, 0xa1, 0xa3, 0x3a, 0xd3, 0xe9, 0x96, 0xc4, 0x26);
DEFINE_GUID(IID_InterractionInterface, 0xc191f3ac, 0x79e1, 0x4be3, 0xbb, 0x87, 0xac, 0x7a, 0xb8, 0x24, 0xd6, 0xb9);
class IInterractionInterface : public IUnknown
{
public:
STDMETHOD (Test(int)) PURE;
};