C++ 进程外COM工厂CreateInstance返回意外的E_

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

我正在尝试使用factory创建COM对象的实例

我的服务器代码是:

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, &regID);

    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;
};