c++ - 关闭应用程序时如何抑制 "There are still active COM objects in this application"错误?

标签 c++ windows c++builder atl vcl

我编写了一些 ATL COM 对象,用于在我的 C++ Builder 应用程序中进行拖放操作。

由于我无法控制的原因,当用户尝试关闭我的应用程序时,它仍然具有事件的 COM 对象。这是因为使用我的对象的其他 COM 客户端似乎缓存了我的 COM 对象并且不释放它们 - 因此,当用户单击“X”关闭我的程序时,我的 COM 对象的引用计数仍然大于零。这会导致用户收到如下不友好的消息:

enter image description here

我希望我的应用程序能够静默终止,而不是问用户这个恼人的问题。

如何隐藏此消息?

最佳答案

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

如果您不提供自己的初始化回调,TATLModule 构造函数将调用 InitATLServer()。因此,为了避免弹出窗口,只需在项目的主 .cpp 文件中传入一个自定义回调,该回调将执行 TATLModule::InitATLServer() 通常执行的所有操作,而不是调用 AddTerminateProc() ,例如:

void __fastcall MyInitATLServer();

TComModule _ProjectModule(&MyInitATLServer); // <-- here
TComModule &_Module = _ProjectModule;

BEGIN_OBJECT_MAP(ObjectMap)
  ...
END_OBJECT_MAP()

void __fastcall MyInitATLServer()
{
    if (TComModule::SaveInitProc)
        TComModule::SaveInitProc();

    _Module.Init(ObjectMap, Sysinit::HInstance);
    _Module.m_ThreadID = ::GetCurrentThreadId();
    _Module.m_bAutomationServer = true;
    _Module.DoFileAndObjectRegistration();
    // AddTerminationProc(AutomationTerminationProc); // <-- no more popup!
}

关于c++ - 关闭应用程序时如何抑制 "There are still active COM objects in this application"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601204/

相关文章:

delphi - 将 C++Builder 代码公开给 Delphi 的最佳方式是什么

c# - C# 与 C/C++ 中的静态数组

C++ 是 operator!= operator== 定义时自动提供

c# - .NET native Windows 商店发布

c - 为什么在 64 计算机上调试 32 位应用程序时得到 STATUS_WX86_BREAKPOINT 而不是 EXCEPTION_BREAKPOINT?

c++ - C++ Builder 6 和 Windows 7 64 位上的 ADOQuery

c++ - Boost Spirit 解析不正确

c++ - 如何为 OpenGL ES 重写 2D OpenGL 应用程序?

x86-64/Windows 下正确的上下文切换

c++ - 比较两个 TDateTime 变量