0

在我的多线程应用程序中,多个线程通过 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 及更早版本。

4

2 回答 2

0

确保在 T1 和 T2 启动之前在主线程上调用 MAPIInitialize,并在两个线程退出后调用 MAPIUninitialize。

于 2015-12-01T13:54:44.437 回答
0

T1 用在主线程上,T2 用在辅助线程上吗?

查看MAPI 多线程规则页面,该页面声明如下:

如果未使用 MAPI_MULTITHREAD_NOTIFICATIONS,则调用 MAPIInitialize 的第一个线程应该比所有其他 MAPI 线程的寿命更长,并且应该是最后一个调用 MAPIUninitialize 的线程。

看起来提到的标志现在没有任何作用,您应该保留调用顺序,即使用 LIFO(后进先出)。

于 2015-12-01T09:48:23.623 回答