CoCreateInstance在单线程exe COM客户端中挂起

时间:2013-07-12 03:33:00

标签: c++ com

我正在学习COM的基础知识。现在我正在编写进程外服务器。 我写了非常基本的服务器应用程序,DLL /存根和客户端应用程序。

如果我在进程中注册服务器并使用CoCreateInstance创建对象的实例,它可以工作:

服务器/客户端:

int _tmain(int argc, _TCHAR* argv[])
{
    IClassFactory *factory = new ISimpleServerFactory();
    DWORD classToken;

    ::CoInitialize(NULL);
    CoRegisterClassObject(
        IID_ISimpleServer, 
        factory, 
        CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE, 
        &classToken);

    ISimpleServer *pISimpleServer = NULL;

    HRESULT hr = CoCreateInstance(
        CLSID_CSimpleServer, 
        NULL, 
        CLSCTX_LOCAL_SERVER, 
        IID_ISimpleServer,
        (void **)&pISimpleServer);           //<===========SUCCESS

    if(SUCCEEDED(hr))
        printf("Instantiation successful\n");

    if(pISimpleServer != NULL)
        pISimpleServer->Release();

    std::cin.ignore();
    CoRevokeClassObject(classToken);
    ::CoUninitialize();
    return 0;
}

现在我尝试将其拆分为单独的应用程序:

服务器

int _tmain(int argc, _TCHAR* argv[])
{
    IClassFactory *factory = new ISimpleServerFactory();
    DWORD classToken;

    ::CoInitialize(NULL);
    CoRegisterClassObject(
        IID_ISimpleServer, 
        factory, 
        CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE, 
        &classToken);

    if(SUCCEEDED(hr))
        printf("Instantiation successful\n");

    if(pISimpleServer != NULL)
        pISimpleServer->Release();

    std::cin.ignore();
    CoRevokeClassObject(classToken);
    ::CoUninitialize();
    return 0;
}

客户端:

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);

    SimpleServer::ISimpleServer *pISimpleServer = NULL;

    HRESULT hr = CoCreateInstance(
        CLSID_CSimpleServer, 
        NULL, 
        CLSCTX_LOCAL_SERVER, 
        IID_ISimpleServer,
        (void **)&pISimpleServer);       // HERE IT HANGS

    if (SUCCEEDED(hr))
    {
        //*****SMTH***
    }
    else
    {
        printf("Failed to load COM object (server not loaded?)\n");
    }

    if(pISimpleServer != NULL)
        pISimpleServer->Release();

    CoUninitialize();

    std::cin.ignore();

    return 0;
}

客户端正在运行。 如果服务器没有启动,客户端类型“无法加载COM对象(服务器未加载?)”,所以我认为这不是服务器注册的问题。

但那可能是什么呢?

1 个答案:

答案 0 :(得分:0)

好吧,就像Raymond指出的那样,我的服务器并没有提供信息。我添加了

MSG msg;
while (GetMessage(&msg, 0, 0, 0) > 0) 
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    if(_kbhit())
        break;
}

进入服务器主体并且它变得更好了:)