2013-03-27 2 views
0

Я создал приложение, которое обращается к Exchange Server через MAPI. Приложение Tray используется для запуска, остановки и настройки приложения. Я поместил всю логику связи и обработки в отдельную библиотеку, которая обрабатывает почту по таймеру. При работе в режиме отладки доступ к библиотеке осуществляется непосредственно из приложения Tray, но при запуске в режиме выпуска он вызывается службой, установленной на уровне пользователя. См. Диаграмму ниже.Связь не работает при запуске службы

enter image description here

У меня есть все настроено для работы с использованием 64 разрядной версии Outlook 2010. Проблема, которую я имею что когда я построить и установить в Debug (доступ к библиотеке напрямую), все работает правильно. Если я устанавливаю сборку Release и запускаю ее как службу, соединение MAPI не инициализируется.

Кажется, я обращаюсь к COM-объекту, так как получаю возвращаемое значение из метода, который я вызываю, а не из исключения. Я установил учетную запись пользователя на свой собственный логин на время, поэтому у меня должно быть разрешение на доступ к профилю. Хотя я могу опубликовать код инициализации, но я не верю, что это поможет. Я думаю, что проблема больше связана с разрешениями. Я попытался запустить тестовую установку под каждым из 4 типов учетных записей, связанных с сервисом, и никто из них не работает. Возможно ли, что моя учетная запись пользователя не имеет доступа к моему профилю почты?

Если у кого-то есть идеи о том, что я могу делать неправильно, я был бы признателен за понимание.

EDIT

Я получаю 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

+0

Скорее всего, я думаю, что проблема с разрешением. вы можете попробовать изменить учетные данные службы Windows (по умолчанию LocalSystem) с вашими учетными данными пользователя Windows (зарегистрированный пользователь) и посмотреть, работает ли он ... –

+0

@ sumeet-kumar: Спасибо за ответ. Я работаю под учетной записью пользователя, хотя я попытался перейти ко всем учетным записям, чтобы увидеть, будет ли это иметь значение. Я согласен с тем, что это, вероятно, проблема с разрешением, но не знаю, почему у службы нет разрешений в учетной записи пользователя. – Tim

ответ

0

Решение было опубликовано Дмитрий Streblechenko, и можно найти здесь: http://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/7a9cc40a-ffd6-4f83-9973-5410615b4df4.

В основном, MAPI инициализировался дважды, поэтому мне пришлось добавить MAPI_NO_COINIT к моим флагам. После этого все сработало.

Благодарим всех вас за помощь.

Смежные вопросы