【问题标题】:COM "Server busy" dialog on MFCMFC 上的 COM“服务器忙”对话框
【发布时间】:2012-03-06 19:48:38
【问题描述】:

我有一个 MFC 应用程序,它会弹出一个服务器繁忙的对话框,如下所示: https://stackoverflow.com/questions/4968872/how-can-i-disable-the-ole-server-busy-dialog-in-a-c-sharp-app

此应用程序调用 AfxOleInit()。 http://support.microsoft.com/kb/248019 解释说我应该这样做 AfxOleGetMessageFilter()->SetMessagePendingDelay(nTimeout); 以避免得到对话框。它还建议我使用 OleInitialize 而不是 AfxOleInit 来抑制对话框。

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

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

谢谢

【问题讨论】:

  • 不要向信使开枪。你的 UI 线程不应该运行代码超过几秒钟,也不应该阻塞。使用线程来执行缓慢的操作,让您的 UI 响应用户输入。使此对话框也消失。

标签: com


【解决方案1】:

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

它初始化 COM 环境,因此您可以使用 OLE 自动化、丰富的 OLE 容器、ActiveX 控件等。但附加性它安装了一个消息过滤器,然后您可以使用AfxOleGetMessageFilter() 获取该过滤器。此消息筛选器专用于处理 OLE 请求阻塞 UI 太长时间的情况。

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

同样按照文章中的建议,您可以使用

AfxOleInit()
....
AfxOleGetMessageFilter()->EnableNotRespondingDialog(FALSE);

禁用此对话框。

但最好的办法是找出根本问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2011-02-13
    • 2021-01-22
    • 2012-01-05
    相关资源
    最近更新 更多