我编写了一些 ATL COM 对象,用于在我的 C++ Builder 应用程序中进行拖放操作。
由于我无法控制的原因,当用户尝试关闭我的应用程序时,它仍然具有事件的 COM 对象。这是因为使用我的对象的其他 COM 客户端似乎缓存了我的 COM 对象并且不释放它们 - 因此,当用户单击“X”关闭我的程序时,我的 COM 对象的引用计数仍然大于零。这会导致用户收到如下不友好的消息:
我希望我的应用程序能够静默终止,而不是问用户这个恼人的问题。
如何隐藏此消息?
最佳答案
弹出消息由 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/