我创建了一个实现COM对象的COM对象服务器exe,并调用CoRegisterClassObject,然后长时间休眠(以防止进程退出)
运行之后,我有另一个COM客户端exe,它使用先前在CoRegisterClassObject上注册的对象的CLSID调用CoCreateInstance,
CoCreateInstance冻结线程,但如果我关闭COM服务器进程 - 那么CoCreateInstance会立即返回" Class未注册。"。
你们中的任何人都知道发生了什么吗?
谢谢。
答案 0 :(得分:1)
然后睡了很长时间(以防止进程退出)
据说,服务器端对象存在于STA中,这反过来要求消息泵/调度在其线程上具有良好的信誉。通过在那里睡觉来冻结线程会阻止其操作。客户端进程等待与服务器进程/公寓的通信,并且预期也会锁定。
您需要使用消息泵循环替换Sleep
调用:
MSG Message;
while(GetMessage(&Message, NULL, WM_NULL, WM_NULL) > 0)
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
典型的流程退出预防是定期检查未完成的外部COM引用量。如果计数器大于零,并且在检查时为零 - 那么现在是退出的好时机。