2013-03-27 66 views
0

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

enter image description here

我把一切都配置为使用Outlook 2010中的64位版本的我遇到的问题是,当我建立和调试安装(直接访问库),一切工作正常运行。如果我安装Release版本并作为服务运行,则MAPI连接不会初始化。

我似乎访问COM对象,因为我正在从我打电话,而不是一个异常的方法的返回值。我已将用户帐户设置为我自己的登录帐户,因此我应具有访问配置文件的权限。虽然我可以发布初始化代码,但我不相信这会有所帮助。我认为这个问题更多的是与权限有关。我曾尝试在与服务关联的4个帐户类型中的每一个帐户下运行测试安装,并且它们都不起作用。我的用户帐户可能无法访问我的邮件配置文件吗?

如果任何人有什么我可以做错了任何想法,我将不胜感激的洞察力。

编辑

我收到HRESULT Cannot 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; 
} 
+0

事件日志中的任何信息? – I4V 2013-03-27 21:32:12

+0

很可能我认为它的权限问题。你可以尝试用你的Windows用户凭据(登录用户)更改你的Windows服务凭证(默认LocalSystem),看看它是否工作... – 2013-03-27 21:32:34

+0

@ sumeet-kumar:谢谢你的回应。我在用户帐户下运行,尽管我已经尝试更改所有帐户以查看它是否会有所作为。我同意这可能是一个权限问题,但不知道为什么该服务在用户帐户下没有权限。 [使用MAPI从服务访问Exchange服务器]的 – Tim 2013-03-27 21:41:31

回答