Я создал приложение, которое обращается к серверу Exchange через MAPI. Приложение Tray используется для запуска, остановки и настройки приложения. Я поместил всю логику связи и обработки в отдельную библиотеку, которая обрабатывает почту по таймеру. При работе в режиме отладки доступ к библиотеке осуществляется непосредственно из приложения Tray, но при работе в режиме выпуска она вызывается службой, установленной на уровне пользователя. См. диаграмму ниже.
У меня все настроено для работы с 64-разрядной версией Outlook 2010. Проблема заключается в том, что при сборке и установке в Debug (непосредственный доступ к библиотеке) все работает правильно. Если я устанавливаю сборку выпуска и запускаю ее как службу, соединение MAPI не инициализируется.
Кажется, я обращаюсь к объекту COM, так как я получаю возвращаемое значение из метода, который я вызываю, а не исключение. На данный момент я установил для учетной записи пользователя свой собственный логин, поэтому у меня должно быть разрешение на доступ к профилю. Хотя я мог бы опубликовать код инициализации, но я не верю, что это поможет. Я думаю, что проблема больше связана с разрешениями. Я попытался запустить тестовую установку под каждым из 4 типов учетных записей, связанных со службой, и ни один из них не работает. Возможно ли, что моя учетная запись пользователя не имеет доступа к моему почтовому профилю?
Если у кого-то есть какие-либо идеи о том, что я могу делать неправильно, я был бы признателен за понимание.
ИЗМЕНИТЬ
Я получаю HRESULT Cannot change thread mode after it is set.
Изначально я устанавливал для режима потока значение false, но попытался изменить его, чтобы посмотреть, решит ли это проблему. К сожалению, это не так. Я добавил фрагмент кода ниже, если кто-то может найти его полезным.
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;
}