0

我创建了一个通过 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;
}
4

1 回答 1

0

该解决方案由 Dmitry Streblechenko 发布,可在此处找到:http ://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/7a9cc40a-ffd6-4f83-9973-5410615b4df4 。

基本上,MAPI 被初始化了两次,所以我不得不将 MAPI_NO_COINIT 添加到我的标志中。之后,一切正常。

感谢大家的帮助。

于 2013-04-09T20:43:10.543 回答