我有一个由 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代码决定停止它?
答案 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就会关闭。