在外部COM调用期间如何禁止“此操作无法完成”消息?

时间:2012-10-15 15:57:36

标签: vb6 com-interop

背景

我正在使用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的一部分,我无能为力可以改变它。除了在主应用程序中设置该属性,或者将调用减少到小于现有超时之外,是否没有其他解决方案?

1 个答案:

答案 0 :(得分:0)

如果要阻止显示任何消息(例如,如果您已将光标更改为沙漏),则需要使用App.OleRequestPendingTimeout而不是App.OleServerBusyTimeout

或者,您也可以使用App.OLERequestPendingMsgText设置备用消息。这样做只会通过“确定”按钮向用户显示自定义消息 - 这更容易让人感到困惑。

以下是一些示例代码:

' 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