0

我们的一个进程在应用程序关闭期间崩溃。ErrorHandlingClient 是一个 dll。我在故障转储中看到了这一行:

"`CErrorLog::m_IErrorHandlingServerPtr 的动态 atexit 析构函数"

我也在堆栈溢出中搜索了msdn;我无法得到明确的答案。我们的应用程序被移植到 vc 9.0 编译器。对于早期版本,此问题不会发生。我正在粘贴故障转储。

0018fcf4  76c28681 ole32!CStdIdentity::~CStdIdentity+0x8c
0018fcf8  00000002
0018fcfc  0081aa38
0018fd00  0081a990
0018fd04  693bbf14 ErrorHandlingClient!__native_startup_lock
0018fd08  007a1890
0018fd0c  0018fd18
0018fd10  76c285eb ole32!CStdIdentity::`scalar deleting destructor'+0xd
0018fd14  0081a990
0018fd18  0018fd2c
0018fd1c  76c2882a ole32!CStdIdentity::CInternalUnk::Release+0x6e
0018fd20  00000001
0018fd24  005c037c
0018fd28  737d3607 msvcr90!_decode_pointer
0018fd2c  0018fd38
0018fd30  76d3b6b9 ole32!IUnknown_Release_Proxy+0x11
0018fd34  80000000
0018fd38  0018fd60
0018fd3c  693a8421 ErrorHandlingClient!`dynamic atexit destructor for 'CErrorLog::m_IErrorHandlingServerPtr''+0x11
0018fd40  0081c9ec
0018fd44  693a462f ErrorHandlingClient!_CRT_INIT+0x1be [f:\dd\vctools\crt_bld\self_x86\crt\src\crtdll.c @ 449]
0018fd48  693a8410 ErrorHandlingClient!`dynamic atexit destructor for 'CErrorLog::m_IErrorHandlingServerPtr''
0018fd4c  00000001
0018fd50  00000000
0018fd54  69390000 ErrorHandlingClient!Define_the_symbol__ATL_MIXED::Thank_you::Thank_you <PERF> (ErrorHandlingClient+0x0)
0018fd58  693a8410 ErrorHandlingClient!`dynamic atexit destructor for 'CErrorLog::m_IErrorHandlingServerPtr''
0018fd5c  00000000
0018fd60  0018fda4
0018fd64  693a474e ErrorHandlingClient!__DllMainCRTStartup+0xb7 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtdll.c @ 560]
4

1 回答 1

0

您还没有真正提供足够的信息,但这是在 COM 未初始化后破坏 COM 对象的问题吗?

m_IErrorHandlingServerPtr 给出的奇怪名称可能是一个 COM 共享指针,当最后一个实例(作为类的成员持有)超出范围时它会销毁,但它需要 COM 仍然存在才能执行此删除。

一种可能的解决方案是确保您的类有自己的 Initialize/Uninitialize 对,这可以通过从在其构造函数中进行初始化并在其析构函数中取消初始化的基类派生来实现。您可以为此使用私有继承。您必须小心不同的线程模型。

不知道为什么它不会在旧环境中崩溃,但他们过去可能已经将 COM 用于各种事情,现在已经更改为不使用 COM,因此 COM 碰巧还活着。此外,如果这是某种全局的,它们的破坏顺序总是不确定的,所以本质上这总是未定义的行为,但过去观察到的“未定义”行为是它刚刚起作用,现在它没有吨。

于 2012-06-14T09:14:22.463 回答