2013-03-27 17 views
0

運行不工作通訊我已經創建了一個通過MAPI訪問Exchange服務器的應用程序。托盤應用程序用於啓動,停止和配置應用程序。我已將所有通信和處理邏輯放入一個單獨的庫中,該庫在計時器上處理郵件。當以調試模式運行時,庫可以直接從托盤應用程序訪問,但是在發佈模式下運行時,它將由安裝在用戶級別的服務調用。見下圖。當作爲服務

enter image description here

我把一切都配置爲使用Outlook 2010中的64位版本的我遇到的問題是,當我建立和調試安裝(直接訪問庫),一切工作正常運行。如果我安裝Release版本並作爲服務運行,則MAPI連接不會初始化。

我似乎訪問COM對象,因爲我正在從我打電話,而不是一個異常的方法的返回值。我已將用戶帳戶設置爲我自己的登錄帳戶,因此我應具有訪問配置文件的權限。雖然我可以發佈初始化代碼,但我不相信這會有所幫助。我認爲這個問題更多的是與權限有關。我曾嘗試在與服務關聯的4個帳戶類型中的每一個帳戶下運行測試安裝,並且它們都不起作用。我的用戶帳戶可能無法訪問我的郵件配置文件嗎?

如果任何人有什麼我可以做錯了任何想法,我將不勝感激的洞察力。

編輯

我收到HRESULT Cannot change thread mode after it is set.我最初設置線程模式,以假的,但試圖改變它,看看它是否會解決這個問題。不幸的是,它沒有。我在下面添加了一段代碼,以防有人發現它有幫助。

DWORD dwFlags=0; 
if(bMultiThreadedNotifications) dwFlags|=MAPI_MULTITHREAD_NOTIFICATIONS; 
if(bInitAsService) dwFlags|=MAPI_NT_SERVICE; 

if(dwFlags) 
{ 
    MAPIINIT_0 MAPIInit={ MAPI_INIT_VERSION, dwFlags }; 
    lastErrorCode = MAPIInitialize(&MAPIInit); 
    //if(lastErrorCode!=S_OK) return FALSE; 
    if(FAILED(lastErrorCode)) result = FALSE; 
} 
else 
{ 
    lastErrorCode = MAPIInitialize(NULL); 
    //if(lastErrorCode!=S_OK) return FALSE; 
    if(FAILED(lastErrorCode)) result = FALSE; 
} 
+0

事件日誌中的任何信息? – I4V 2013-03-27 21:32:12

+0

很可能我認爲它的權限問題。你可以嘗試用你的Windows用戶憑據(登錄用戶)更改你的Windows服務憑證(默認LocalSystem),看看它是否工作... – 2013-03-27 21:32:34

+0

@ sumeet-kumar:謝謝你的迴應。我在用戶帳戶下運行,儘管我已經嘗試更改所有帳戶以查看它是否會有所作爲。我同意這可能是一個權限問題,但不知道爲什麼該服務在用戶帳戶下沒有權限。 [使用MAPI從服務訪問Exchange服務器]的 – Tim 2013-03-27 21:41:31

回答