在我的多线程应用程序中,多个线程通过 mapiinitialize
mapi.MAPIInitialize((0, mapi.MAPI_MULTITHREAD_NOTIFICATIONS))
mapi.MAPIUninitialize() crashes. I got the following call stack from windbg.
mso30win32client!Ordinal250+0x32423
mso30win32client!Ordinal126+0x5b
mso30win32client!Ordinal1337+0x39d
mso30win32client!Ordinal1470+0x17e
mso30win32client!Ordinal1470+0xe
mso40uiwin32client!Ordinal2408+0x19
olmapi32!LINKEDLIST_RemoveKey+0x4e6
olmapi32!HrUninitMso+0x36
olmapi32!MAPIUninitialize+0x9
MSMAPI32!MAPIUninitialize+0x42
MAPI32!MAPIUninitialize+0x5b
mapi+0x11d9
每个线程仅在 mapi(Outlook 2016) 调用下按顺序执行:
1 MAPIInitialize
2 MAPIAdminProfiles
3 HrQueryAllRows
4 session=MAPILogonEx
5 session.logoff
6 MAPIUninitialize
观察:
如果有两个线程 T1 和 T2 。
T1 在 T2 之前登录到会话并且 T1 在 T2 之后执行 MAPIUninitialize 它不会导致崩溃,
但是如果 T1 在 T2 之前登录到会话并且 T1 在 T2 之前执行 MAPIUninitialize 然后调用 MAPIUninitialize 会导致上面的堆栈崩溃。
Outlook 2016 崩溃仅适用于 Outlook 2013 及更早版本。