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

我有一个由VB6 EXE托pipe的COM自动化服务器

COM VBA使用Excel VBA

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

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

但是EXE很快就被Excelclosures了,我猜测Excel什么时候决定不再需要COM API了。

此行为导致随机错误。

简单的解决scheme是在运行VBA代码之前启动exe; 在这种情况下,所有工作正常,因为exe将不会停止运行,直到用户closures。

你有一些关于Excel VBApipe理托pipeAPI调用方式的信息/文档吗?

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

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

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

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

然后,服务器生命连接到variables的生命周期。 当函数完成时,该variables被设置为空,然后服务器将被closures(除非有其他variables保持活动)。

为了确保您的COM服务器保持更长时间的活动状态,只需将该variables定义为Publicvariables,如下面的示例所示。

此示例将启动并显示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 

从COM文档。

  **Component Automation** 

closures对象

ActiveX对象必须按以下方式closures:

如果对象的应用程序是可见的,则对象只能响应显式用户命令(例如,单击“文件”菜单上的“退出”)或来自ActiveX客户端的等效命令才能closures。

如果对象的应用程序不可见,只有当最后一个外部参考消失后,对象才会closures。

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

©Microsoft Corporation。 版权所有。

当你编写一个COM服务器exe文件时,你首先要做的就是在正常的exe文件中引用自己,否则只要初始化结束,exe文件就会closures。