如何在外部 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 调用期间抑制“此操作无法完成”消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在内部 div 悬停时从外部 div 中删除图标?

Magento:如何让观察者在外部脚本中工作?

如何在“hg com”期间获得mercurial来显示差异?

在外部 Rexx 脚本中调用特定函数

如何在外部模块中使用 Laravel 类?

如何在外部网页上自动填充表单数据?