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

Winapi 创建由COM LocalServer实现的对象的实例会冻结,winapi,com,ipc,Winapi,Com,Ipc,我创建了一个COM对象服务器exe,它实现了一个COM对象,并调用CoreRegisterClassObject,然后长时间休眠(以防止进程退出) 运行它之后,我有了另一个COM客户端exe,它使用之前在CoreRegisterClassObject上注册的对象的CLSID调用CoCreateInstance CoCreateInstance冻结线程,但如果我关闭COM服务器进程,则CoCreateInstance会立即返回“未注册的类” 你们知道发生了什么事吗 多谢各位 然后长时间睡眠(防止进

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

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

CoCreateInstance冻结线程,但如果我关闭COM服务器进程,则CoCreateInstance会立即返回“未注册的类”

你们知道发生了什么事吗

多谢各位

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

据推测,服务器端对象存在于STA中,这反过来要求其线程上的消息泵/调度处于良好状态。通过在那里睡觉来冻结线程会阻止其操作。客户端进程等待与服务器进程/单元的通信,并期望锁定

您需要将
Sleep
呼叫替换为消息泵循环:

MSG消息;
while(GetMessage(&Message,NULL,WM_NULL,WM_NULL)>0)
{
翻译消息(和消息);
DispatchMessage(&Message);
}
典型的进程退出预防是定期检查未完成的外部COM引用的数量。如果计数器曾经大于零,并且在检查时刻为零,那么现在是退出的好时机

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

据推测,服务器端对象存在于STA中,这反过来要求其线程上的消息泵/调度处于良好状态。通过在那里睡觉来冻结线程会阻止其操作。客户端进程等待与服务器进程/单元的通信,并期望锁定

您需要将
Sleep
呼叫替换为消息泵循环:

MSG消息;
while(GetMessage(&Message,NULL,WM_NULL,WM_NULL)>0)
{
翻译消息(和消息);
DispatchMessage(&Message);
}

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

太棒了!我不知道COM使用窗口消息在进程之间进行通信。太棒了!我不知道COM使用窗口消息在进程之间进行通信。