我创建了一个COM对象服务器exe,它实现了一个COM对象,并调用了CoRegisterClassObject,然后休眠了很长时间(以防止进程退出)。
在运行它之后,我有另一个COM客户端exe,它使用先前在CoCreateInstance上注册的对象的CLSID调用CoRegisterClassObject,
CoCreateInstance冻结线程,但如果关闭close进程,CoCreateInstance将立即返回“未注册的类”。
你们谁知道发生了什么事?
谢谢。
发布于 2013-08-17 11:56:56
然后睡很长一段时间(以防止这个过程退出)
据推测,服务器端对象驻留在STA中,而STA又要求线程上的消息泵/调度保持良好状态。通过在那里睡觉来冻结线程,你就阻止了它的操作。客户端进程等待与服务器进程/单元的通信,以及预期的锁定。
您需要用消息泵循环替换Sleep调用:
MSG Message;
while(GetMessage(&Message, NULL, WM_NULL, WM_NULL) > 0)
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}一个典型的过程退出预防是定期检查未完成的外部COM引用的数量。如果计数器大于零,并且在检查时刻为零,那么现在是退出的好时机。
https://stackoverflow.com/questions/18288127
复制相似问题