1

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

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

CoCreateInstance 冻结线程,但如果我关闭 COM 服务器进程 - 然后 CoCreateInstance 立即返回“类未注册。”。

你们有谁知道发生了什么事吗?

谢谢你。

4

1 回答 1

1

然后休眠很长时间(防止进程退出)

假设,服务器端对象存在于 STA 中,这反过来需要在其线程上进行消息泵/调度以保持良好状态。通过在那里休眠来冻结线程会阻止它的操作。客户端进程等待与服务器进程/单元的通信,并且预期也会锁定。

您需要Sleep用消息泵循环替换您的呼叫:

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

典型的进程退出预防措施是定期检查未完成的外部 COM 引用的数量。如果计数器曾经大于零,并且在检查时刻为零 - 这是退出的好时机。

于 2013-08-17T11:56:56.497 回答