通信作为服务运行时无效

时间:2013-03-27 21:29:52

标签: c# service com mapi

我创建了一个通过MAPI访问Exchange Server的应用程序。托盘应用程序用于启动,停止和配置应用程序。我已将所有通信和处理逻辑放入一个单独的库中,该库在计时器上处理邮件。在调试模式下运行时,可直接从托盘应用程序访问库,但在发布模式下运行时,将由安装在用户级别的服务调用该库。见下图。

enter image description here

我已将所有配置为使用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;
}

1 个答案:

答案 0 :(得分:0)

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

基本上,MAPI正在初始化两次,因此我必须将MAPI_NO_COINIT添加到我的标志中。之后,一切正常。

谢谢大家的帮助。

相关问题