Связь не работает при запуске в качестве службы

Я создал приложение, которое обращается к серверу 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;
}

person Tim    schedule 27.03.2013    source источник
comment
Есть информация в журнале событий?   -  person I4V    schedule 28.03.2013
comment
Скорее всего, я думаю, что это проблема с разрешением. можете ли вы попробовать изменить свои учетные данные службы Windows (по умолчанию LocalSystem) с вашими учетными данными пользователя Windows (зарегистрированный пользователь) и посмотреть, работает ли это...   -  person sumeet kumar    schedule 28.03.2013
comment
@sumeet-kumar: Спасибо за ответ. Я работаю под учетной записью пользователя, хотя я пытался перейти на все учетные записи, чтобы увидеть, будет ли это иметь значение. Я согласен, что это, вероятно, проблема с разрешением, но не уверен, почему у службы нет разрешений для учетной записи пользователя.   -  person Tim    schedule 28.03.2013
comment
возможный дубликат Использование MAPI для доступа к серверу Exchange из Сервис   -  person Ken White    schedule 28.03.2013
comment
@14V: К сожалению, нет никаких журналов событий, кроме того, в котором говорится, что служба запущена правильно, и тех, которые я туда поместил,   -  person Tim    schedule 28.03.2013
comment
Согласно другому сообщению, убедитесь, что служба работает под именем владельца почтового ящика!!! посмотрите, поможет ли это   -  person sumeet kumar    schedule 28.03.2013
comment
Можете быть более конкретными? Какой соответствующий фрагмент вашего кода не работает? Какие ошибки?   -  person Dmitry Streblechenko    schedule 28.03.2013
comment
как настроить таймер?   -  person Zdeslav Vojkovic    schedule 28.03.2013


Ответы (1)


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

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

Спасибо за вашу помощь.

person Tim    schedule 09.04.2013