强制COM服务器保持打开状态

时间:2015-07-03 09:55:57

标签: excel vba com vb6 office-automation

我有一个由 VB6 exe 托管的 COM自动化服务器

COM API 用于 Excel VBA

Dim o as MyCOMAPI.MyCOMType
Set o = new MyCOMAPI.MyCOMType
o.DoSomething

当我在VBA中创建对象时,exe与COM自动化一起启动,VBA可以使用API​​。

但是Excel很快就会“随机”关闭exe,我想当Excel决定它不再需要COM API时。

此行为导致随机错误。

简单的解决方案是在运行VBA代码之前启动exe;在这种情况下,一切正常,因为exe在用户关闭之前不会停止运行。

您是否掌握了有关Excel VBA管理托管API调用方式的信息/文档?

有没有办法避免这种行为并让exe保持打开,直到VBA代码决定停止它?

2 个答案:

答案 0 :(得分:4)

这将是取消引用最后一个对象时COM自动化服务器的默认行为,这意味着指向服务器的变量设置为空。

现在,如果您的代码今天看起来像这样:

Sub MyFunction()
...
Dim o as MyCOMAPI.MyCOMType
Set o = new MyCOMAPI.MyCOMType
o.DoSomething
End Sub

然后,服务器生命周期与 o 变量的生命周期相关联。当函数完成时,该变量被设置为空,然后服务器将被关闭(除非有其他变量使其保持活动状态)。

要确保COM服务器保持较长时间,只需将变量定义为Public变量,如下例所示。

此示例将启动并显示Excel并保持打开状态,直到调用ShutdownExcel函数。

Public o As Excel.Application

Sub MakeSureExcelIsRunning()
    If o Is Nothing Then
        Set o = New Excel.Application
        o.Visible = True
    End If
End Sub

Sub ShutdownExcel()
    Set o = Nothing
End Sub

答案 1 :(得分:1)

来自COM文档。

 **Component Automation**  
     

关闭对象

     

ActiveX对象必须按以下方式关闭:

     

如果对象的应用程序可见,则该对象应仅在响应显式用户命令(例如,单击“文件”菜单上的“退出”)或来自ActiveX客户端的等效命令时关闭。

     

如果对象的应用程序不可见,则只有当最后一个外部引用消失时,该对象才会关闭。

     

如果对象的应用程序是可见的并且由ActiveX客户端控制,则当用户关闭它时它将变为不可见(例如,单击“文件”菜单上的“退出”)。此行为允许控制器继续控制对象。只有当对象的最后一个外部引用消失时,控制器才应该关闭。

     

©Microsoft Corporation。版权所有。

当你编写一个COM服务器exe时,你做的第一件事就是在作为普通的exe开始时引用自己,否则一旦初始化结束,exe就会关闭。