2015-06-11 27 views
0

當前MFCMAPI使用單個線程來序列化所有MAPI調用。 Mapi提供程序初始化並將文件夾名稱等存儲爲成員變量,然後讀取郵箱。如何使用IMoniker和IStream接口異步讀取交換服務器

這可能會導致交換消息和附件的處理速度變慢。例如,查詢附件文件並等待它返回時代價高昂。所以最好能發送請求來讀取消息,同時可以做另一個進程(初始化另一個消息)。

那麼,是否有可能通過IMonikers和IBindStatusCallback :: OnDataAvailable初始化下一條消息來查詢和讀取消息。

或者還有其他方法可以做到嗎?

我試圖使用IMoniker和IStream從異步交換服務器讀取數據,我試圖使用BindToStorage進行異步綁定並從OnDataAvailable讀取日期。綁定代碼如下所示。

hRes = CoInitialize(NULL); 
CComPtr<IBindCtx> pbc; 
CComPtr<IMoniker> pmk; 
CComPtr <IStream> lpStream1; 
ULONG chEaten = 0; 

hRes = CreateBindCtx(0, &pbc); 
OLECHAR string[] = 
    L"Session:3!clsid:10000013-0000-0000-0000-000000000001"; 
if (FAILED(hRes = MkParseDisplayName(pbc, string, &chEaten, &pmk))) 
{ 
    return 0; 
} 
hRes = pmk->BindToStorage(pbc, NULL, IID_IStream,reinterpret_cast<void **>(&lpStream1)); 

但是,當調用BindToStorage時,它返回Class not Registered。 有誰知道哪部分是錯的?

是否有可能通過此方法異步地從交換服務器讀取數據?

感謝

+0

[code snippet](https://msdn.microsoft.com/en-us/library/aa383539)的會話三是硬編碼的,但您可能有其他的。 –

回答

1

無可否認它已經有一段時間,因爲我仔細看了看MFCMAPI源代碼,但我不認爲它這樣的事。

如果要異步檢索數據,則需要啓動一個新線程,初始化MAPI,並在該線程上執行任何需要執行的冗長操作。

你想要讀什麼樣的數據?

+0

我正在閱讀電子郵件和附件。但是,多線程似乎會有問題,http://blogs.msdn.com/b/stephen_griffin/archive/2011/10/19/random-mapi-e-call-failed-errors-with-exchange-2010。 ASPX。我正在嘗試更改代碼,以便在程序處理其他任務時可以預先從交換機中加載電子郵件。 – user2753594

+0

您無法讀取整個電子郵件,只能看到特定的二進制或字符串屬性,例如PR_BODY,PR_HTML或PR_RTF_COMPRERSSED。如果您在該線程上執行所有MAPI相關功能,多線程將會很好。 –

1

MFCMAPI在加載文件夾時已經使用工作線程處理QueryRows調用。除此之外,我並沒有真正將代碼的清晰度/簡單性作爲目標,所以我沒有打擾線程。

我忽略了關於IMoniker和BindToStorage的問題,因爲在大多數情況下,MAPI不是COM,所以我沒有看到他們必須做什麼來旋轉線程來運行MAPI代碼。如果您想從工作線程讀取流,請確保在該線程上初始化MAPI。

您是否嘗試重做MFCMAPI本身的一部分,或者您是否正在使用MFCMAPI作爲模型爲自己的應用程序編寫代碼?如果在MFCMAPI中,您針對哪種特定場景?