我创建了一个通过 MAPI 访问 Exchange Server 的应用程序。托盘应用程序用于启动、停止和配置应用程序。我已将所有通信和处理逻辑放入一个单独的库中,该库在计时器上处理邮件。在调试模式下运行时,库直接从托盘应用程序访问,但在发布模式下运行时,它被安装在用户级别的服务调用。见下图。
我已将所有内容配置为使用 x64 位版本的 Outlook 2010 运行。我遇到的问题是,当我在 Debug 中构建和安装时(直接访问库),一切正常。如果我安装 Release 版本并作为服务运行,则 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;
}