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

加洛·罗布(Garo Robe)

我正在学习COM的基础知识。现在,我正在编写进程外服务器。我写了相当基本的服务器应用程序,dll / stub和客户端应用程序。

如果我注册服务器并使用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对象(服务器未加载?)”,因此我想这不是服务器注册的问题。

但是那会是什么呢?

加洛·罗布(Garo Robe)

好的,就像雷蒙德指出的那样,我的服务器未在发送消息。我加了

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

进入服务器主体,它会变得更好:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

nodejs在提供单线程环境时如何处理多个客户端

来自分类Dev

为什么单线程进程有多个 Sidekiq 客户端连接?

来自分类Dev

D中的单线程将来/承诺?

来自分类Dev

Java中单线程死锁

来自分类Dev

Java中的单线程查询

来自分类Dev

多线程客户端中COM对象的初始化和实例化

来自分类Dev

ruby 中的多线程比单线程慢

来自分类Dev

Java客户端中的RabbitMQ通道和线程

来自分类Dev

客户端无响应-Python中的多线程

来自分类Dev

单线程程序中可以有竞争条件吗?

来自分类Dev

matplotlib在简单线程中绘制冻结

来自分类Dev

尝试在C ++中创建简单线程时出错

来自分类Dev

JavaScript中的setInterval和clearInterval作为单线程语言

来自分类Dev

单线程程序是否在CPU中并行执行?

来自分类Dev

matplotlib在简单线程中绘制冻结

来自分类Dev

尝试在C ++中创建简单线程时出错

来自分类Dev

在该方法中仅运行单线程

来自分类Dev

是否可以为多个客户端创建单个套接字,单线程,TCP / IP数据包读取器?

来自分类Dev

在单线程应用程序中,是否只有一个线程是内核线程?

来自分类Dev

RabbitMQ客户端挂在channel.close()和connection.close()中

来自分类Dev

RabbitMQ客户端挂在channel.close()和connection.close()中

来自分类Dev

java-多线程中的简单计算所需时间比单线程中的更长

来自分类Dev

多线程,java聊天客户端

来自分类Dev

多线程JMX客户端

来自分类Dev

多线程Java TCP客户端

来自分类Dev

ZMQ多线程C客户端

来自分类Dev

多线程 JMS 客户端 ActiveMQ

来自分类Dev

Node.JS中的单线程事件循环与多线程非阻塞工作者

来自分类Dev

单线程与多线程中的反应堆设计模式

Related 相关文章

热门标签

归档