0

MAPI を介して Exchange Server にアクセスするアプリケーションを作成しました。Tray アプリは、アプリケーションの開始、停止、構成に使用されます。すべての通信および処理ロジックを、タイマーでメールを処理する別のライブラリに入れました。デバッグ モードで実行している場合、ライブラリは Tray アプリから直接アクセスされますが、リリース モードで実行している場合は、ユーザー レベルでインストールされたサービスによって呼び出されます。下の図を参照してください。

ここに画像の説明を入力

Outlook 2010 の x64 ビット バージョンを使用して実行するようにすべてを構成しました。私が抱えている問題は、ビルドしてデバッグでインストールすると (ライブラリに直接アクセスすると)、すべてが正常に動作することです。リリース ビルドをインストールしてサービスとして実行すると、MAPI 接続が初期化されません。

例外ではなく呼び出したメソッドから戻り値を取得しているため、COM オブジェクトにアクセスしているようです。当面の間、ユーザー アカウントを自分のログインに設定したので、プロファイルにアクセスする権限が必要です。初期化コードを投稿することはできますが、それが役立つとは思いません。問題は権限にもっと関係していると思います。サービスに関連付けられた 4 つのアカウント タイプのそれぞれでテスト インストールを実行しようとしましたが、どれも機能しません。ユーザー アカウントがメール プロファイルにアクセスできない可能性はありますか?

私が間違っているかもしれないことについて誰かが何か考えを持っているなら、私は洞察に感謝します.

編集

最初にスレッドモードをfalseに設定していたHRESULTCannot 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;
}
4

1 に答える 1