创建COM LocalServer实现的对象实例冻结

时间:2013-08-17 11:11:46

标签: winapi com ipc

我创建了一个实现COM对象的COM对象服务器exe,并调用CoRegisterClassObject,然后长时间休眠(以防止进程退出)

运行之后,我有另一个COM客户端exe,它使用先前在CoRegisterClassObject上注册的对象的CLSID调用CoCreateInstance,

CoCreateInstance冻结线程,但如果我关闭COM服务器进程 - 那么CoCreateInstance会立即返回" Class未注册。"。

你们中的任何人都知道发生了什么吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

  

然后睡了很长时间(以防止进程退出)

据说,服务器端对象存在于STA中,这反过来要求消息泵/调度在其线程上具有良好的信誉。通过在那里睡觉来冻结线程会阻止其操作。客户端进程等待与服务器进程/公寓的通信,并且预期也会锁定。

您需要使用消息泵循环替换Sleep调用:

    MSG Message;
    while(GetMessage(&Message, NULL, WM_NULL, WM_NULL) > 0)
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }

典型的流程退出预防是定期检查未完成的外部COM引用量。如果计数器大于零,并且在检查时为零 - 那么现在是退出的好时机。