COM“;“服务器忙”;关于MFC的对话

COM“;“服务器忙”;关于MFC的对话,com,Com,我有一个MFC应用程序,它弹出一个服务器繁忙的dilaog,如下所示: 此应用程序调用AfxOleInit()。 说明我应该这样做 AfxOleGetMessageFilter()->SetMessagePendingDelay(nTimeout); 以避免出现对话框。它还建议我使用OleInitialize而不是AfxOleInit来抑制对话框 这是否意味着如果我不调用AfxOleInit(),那么我就不会让服务器忙对话框? 我无法真正进行测试,因为如果没有AfxOleInit(),AfxO

我有一个MFC应用程序,它弹出一个服务器繁忙的dilaog,如下所示:

此应用程序调用AfxOleInit()。 说明我应该这样做 AfxOleGetMessageFilter()->SetMessagePendingDelay(nTimeout); 以避免出现对话框。它还建议我使用OleInitialize而不是AfxOleInit来抑制对话框

这是否意味着如果我不调用AfxOleInit(),那么我就不会让服务器忙对话框? 我无法真正进行测试,因为如果没有AfxOleInit(),AfxOleGetMessageFilter将返回空指针,因此我无法真正将其设置为1ms,并测试它是否在超时时弹出对话框

所以我的问题是,如果我不打电话给AfxOleInit,那么我会得到“服务器忙”对话框吗


谢谢

看,对
AfxOleInit
的调用与内部调用“”的“”非常相似

它初始化COM环境,因此您可以使用OLE自动化、富OLE容器、ActiveX控件和e.t.c。但另外,它安装了一个消息过滤器,您可以使用
AfxOleGetMessageFilter()
获取该过滤器。此消息筛选器专用于处理OLE请求阻塞UI时间过长的情况

因此,如果您调用
OleInitialize
而不是“AfxOleInit”,则不会安装任何消息筛选器,因此您将不会看到“服务器正忙”对话框,并且AfxOleGetMessageFilter()将指向NULL

正如文章中所建议的,您可以使用

AfxOleInit()
....
AfxOleGetMessageFilter()->EnableNotRespondingDialog(FALSE);
禁用此对话框


但你最好的办法是找到潜在的问题。

不要向信使开枪。UI线程运行代码的时间不应超过几秒钟,也不应阻塞代码。使用线程执行缓慢的操作,使UI对用户输入做出响应。也会使此对话框消失。