如何在closures应用程序时禁止“此应用程序中仍有活动的COM对象”错误?

我已经写了几个ATL COM对象,用于在我的C ++ Builder应用程序中进行拖放操作。

由于我无法控制的原因,当用户尝试closures它时,我的应用程序仍然有活动的COM对象。 这是因为使用我的对象的其他COM客户端似乎caching我的COM对象,并不释放它们 – 因此,当用户单击“X”closures我的程序时,我的COM对象仍然有一个大于零的引用计数。 这导致用户得到如下不友好的消息:

在这里输入图像说明

我想我的应用程序默默终止,而不是问用户这个烦人的问题。

我如何压制这个信息?

Solutions Collecting From Web of "如何在closures应用程序时禁止“此应用程序中仍有活动的COM对象”错误?"

弹出消息由TATLmodulee::AutomationTerminateProc()回调函数显示。 它由TATLmodulee::InitATLserver()回调注册,该回调调用VCL的AddTerminateProc()函数。 当TForm::Close()方法时,它会调用CallTerminationProcs()来查看应用程序是否可以安全地关闭,然后调用TATLmodulee::AutomationTerminateProc()

如果不提供自己的初始化回调, TATLmodulee构造函数会调用InitATLserver() 。 所以为了避免弹出窗口,只需传入一个自定义的回调函数TATLmodulee::InitATLserver()通常不会调用AddTerminateProc() ,例如:

 void __fastcall MyInitATLserver(); TCommodulee _Projectmodulee(&MyInitATLserver); // <-- here TCommodulee &_modulee = _Projectmodulee; BEGIN_OBJECT_MAP(ObjectMap) ... END_OBJECT_MAP() void __fastcall MyInitATLserver() { if (TCommodulee::SaveInitProc) TCommodulee::SaveInitProc(); _modulee.Init(ObjectMap, Sysinit::HInstance); _modulee.m_ThreadID = ::GetCurrentThreadId(); _modulee.m_bAutomationserver = true; _modulee.DoFileAndObjectRegistration(); // AddTerminationProc(AutomationTerminationProc); // <-- no more popup! } 

我找到了一个解决方法。 如果有人发布更好的方法,我会留下这个问题,因为这个方法依赖于C ++ Builder的ATL / VCL库的未公开的内部实现细节。

主要形式是:

 extern TCommodulee &_modulee; void __fastcall TMainAppForm::FormCloseQuery(TObject *Sender, bool &CanClose) { _modulee.m_nLockCnt = 0; 

VCL似乎检查锁计数,并引发close查询事件显示这个恼人的消息。 它只显示锁定计数为0的消息。因此,我将锁定计数设置为0,导致消息不显示。 我认为这样做是无害的,因为我在ATL / VCL源代码中搜索了使用锁定计数的地方,除了检查是否显示此消息的代码之外,没有发现任何东西。

尝试

 TerminateProcess(GetCurrentProcess(),0);

当然,如果没有更好的办法。