调用MAPIUninitializeApi后,应用程序崩溃一次



所以,我一直在使用MAPI API。在这种情况下,每当我调用MAPIUninitializeApi时,我的应用程序就会崩溃。在进一步的调试中,我发现IMAPISession::OpenMsgStore是崩溃的原因,每当在程序运行时执行OpenMsgStore函数时,我的应用程序都会在触发MAPIUninitialize后崩溃。这与下面提到的这个线程中的讨论类似,其中soln不可用。

https://peach.ease.lsoft.com/scripts/wa-PEACH.exe?A2=MAPI-L;e6f3847a.0801&S=

我已经检查了我的程序是否存在内存泄漏,我确信没有,而且,如果我评论那个特定的api,我的程序不会崩溃,我不明白崩溃的原因。我已经尝试了所有可能的选择。有人能帮忙吗?

这很可能意味着您仍然有活动的MAPI对象。也有可能是MAPIInitialize/MAPIUninitialize的顺序太快,并且当您试图关闭公共Office运行时,它仍在(异步(初始化。

此外,并不是所有的商店都是平等创建的——IMAP4可能是最糟糕的。

不清楚在何时何地使用这些方法。它是次要线程吗?

无论如何,以下是MSDN声明:

在使用任何MAPI对象之前,客户端还必须在每个线程上调用MAPIInitialize,并在使用完成后调用MAPIUninitialize。即使要使用的对象是从外部源传递给线程的,也应该进行这些调用。MAPIInitialize和MAPIUninitialize可以从任何地方调用,但Win32 DllMain函数除外,该函数由系统在初始化和终止进程和线程时调用,或在调用LoadLibrary和FreeLibrary函数时调用。

我建议使用MFCMAPI源代码-您可以在调试器下运行它,看看问题是否仍然可以重现。

感谢您的精彩建议。我已经解决了这个问题,我的应用程序实际上调用了golang的c++dll中定义的mapi api。正因为如此,每个定义为DLL函数的mapi api都有不同的线程ID,当我使用运行时将DLL函数调用绑定到同一个线程时。LockOSThread((/运行时。UnlockOSThread((,它开始工作,不再崩溃。

参考编号:https://golang.org/pkg/runtime/#LockOSThread

最新更新