如何在外部 COM 调用期间抑制“此操作无法完成”消息?
Posted
技术标签:
【中文标题】如何在外部 COM 调用期间抑制“此操作无法完成”消息?【英文标题】:How do I suppress the "This action cannot be completed" message during external COM calls? 【发布时间】:2012-10-05 15:38:36 【问题描述】:背景
我正在使用 Visual Basic 开发一个调用进程外 COM 服务器(用 C# 编写的包装 .NET 组件)的应用程序。该组件执行冗长的计算(超过 10 秒)并在计算进行时尝试与 GUI(VB6 端的一部分)进行交互,导致程序发出类似于以下内容的消息(并使用确切的措辞) :
http://www.symantec.com/business/support/library/BUSINESS/ATLAS/images_v1/324876/dlo.jpg
抱歉,图片质量很差,我无法在工作场所的任何地方上传屏幕截图。
问题
有没有办法以编程方式或通过项目或构建配置来抑制此消息?
附录 1
尝试设置 App.OleServerBusyTimeout 会产生运行时错误 369(操作在 ActiveX DLL 中无效)。这是 ActiveX dll 的一部分,我无法改变它。除了在主应用程序中设置该属性,或者将调用减少到小于现有超时之外,没有其他解决方案吗?
【问题讨论】:
没有实用的方法在 VB6 应用程序中实现 IMessageFilter。您最好考虑修复代码而不是射击信使。在您的 .NET 代码中使用 BackgroundWorker,在 RunWorkerCompleted 事件处理程序中触发一个事件,让您的 VB6 代码知道工作已完成。 +1 汉斯。 worker 方法应该立即返回,而不是等待工作完成。然后在工作完成时引发一个事件,告诉 GUI。另一个优点是 GUI 不会无响应。 【参考方案1】:如果您想阻止任何消息出现(例如,如果您将光标更改为沙漏),那么您想使用App.OleRequestPendingTimeout
而不是App.OleServerBusyTimeout
。
您也可以选择使用App.OLERequestPendingMsgText
设置备用消息。这样做只会通过一个 OK 按钮向用户显示您的自定义消息 - 这不会令人困惑。
这里是一些示例代码:
' set up special message if user interacts with application while waiting on the
' long-running operation to complete
' see http://support.microsoft.com/kb/138066
Dim originalOLEPendingMessage As String
originalOLEPendingMessage = App.OleRequestPendingMsgText
App.OleRequestPendingMsgText = "Please be patient while your request is processed."
Dim originalOLEPendingTimeout as Long
originalOLEPendingTimeout = App.OleRequestPendingTimeout
App.OleRequestPendingTimeout = 10000
On Error GoTo Finally
' Call long-running process here
Finally:
' If an actual error occurred we want to capture all the properties of Err
' so we can re-raise it after we clean up
Dim errNumber As Long
Dim ERRSOURCE As String
Dim errDesc As String
Dim errHelpFile As String
Dim errHelpContext As Long
errNumber = Err.Number
ERRSOURCE = Err.Source
errDesc = Err.Description
errHelpFile = Err.HelpFile
errHelpContext = Err.HelpContext
App.OleRequestPendingMsgText = originalOLEPendingMessage
App.OleRequestPendingTimeout = originalOLEPendingTimeout
If errNumber <> 0 Then
Err.Raise errNumber, ERRSOURCE, errDesc, errHelpFile, errHelpContext
End If
有关详细讨论,请参阅 Microsoft 知识库文章 How To Handle OLE Automation Server Timeout and Synchronization。
【讨论】:
以上是关于如何在外部 COM 调用期间抑制“此操作无法完成”消息?的主要内容,如果未能解决你的问题,请参考以下文章