Я создал приложение, которое обращается к Exchange Server через MAPI. Приложение Tray используется для запуска, остановки и настройки приложения. Я поместил всю логику связи и обработки в отдельную библиотеку, которая обрабатывает почту по таймеру. При работе в режиме отладки доступ к библиотеке осуществляется непосредственно из приложения Tray, но при запуске в режиме выпуска он вызывается службой, установленной на уровне пользователя. См. Диаграмму ниже.Связь не работает при запуске службы
У меня есть все настроено для работы с использованием 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;
}
У вас нет информации в журнале событий? – I4V
Скорее всего, я думаю, что проблема с разрешением. вы можете попробовать изменить учетные данные службы Windows (по умолчанию LocalSystem) с вашими учетными данными пользователя Windows (зарегистрированный пользователь) и посмотреть, работает ли он ... –
@ sumeet-kumar: Спасибо за ответ. Я работаю под учетной записью пользователя, хотя я попытался перейти ко всем учетным записям, чтобы увидеть, будет ли это иметь значение. Я согласен с тем, что это, вероятно, проблема с разрешением, но не знаю, почему у службы нет разрешений в учетной записи пользователя. – Tim