关闭通过代码创建和打开的Outlook联系人窗口会关闭Outlook本身(错误)

本文关键字:Outlook 窗口 联系人 错误 本身 代码 创建 | 更新日期: 2023-09-27 18:00:36

我有一个C#WPF应用程序,它读取一堆本地Outlook联系人并将其存储在内存中。当在应用程序中进行搜索时,会生成一个ResultObjects列表,并将其绑定到我的应用程序屏幕上显示的ListBox。ResultObject的一个属性是它派生自的Outlook联系人(Outlook.ContactItem),我用它绑定到按钮标记属性(可以是你想分配给它的任何属性),这样当用户单击他们想要的结果旁边的按钮时,Outlook联系人窗口本身就会打开以显示联系人。

当我最初提取联系人列表时,需要并创建一个Outlook实例,并且运行过程就在那里。

公共Outlook.Application用户Outlook=新Outlook.App()

问题是,在我的代码打开与单击按钮相关联的对象的Outlook联系人窗口后:

buttonContact=(Outlook.ContactItem)((按钮)发件人).Tag;buttonContact.Display()

然后用户关闭该窗口,我正在运行的Outlook.Application(及其进程/PID)随之关闭-这不是我想要的。我需要Outlook为用户希望看到的下一个联系人保持运行。如果没有Outlook仍在运行,则显示联系人的按钮将失败。如果我强行使用Outlook的一个新实例,从而创建一个新进程,单击显示联系人的按钮会引发一个令人讨厌的"RPC服务器不可用"错误,我还无法解决这个错误。

我的应用程序正常工作的唯一方法是,如果用户自己启动Outlook,那么整个应用程序都在他们的机器上运行,然后在我的应用运行时让它继续运行。这样,当他们关闭Outlook通过我的代码打开的联系人时,Outlook本身就会继续前进,然后用户想看到的下一个联系人就会工作。这对我的客户来说是不可接受的——他们要求Outlook运行不是用户的要求。该应用程序需要在代码背后创建一个隐藏的实例,并在我运行应用程序的整个生命周期内对其进行维护。

关闭通过代码创建和打开的Outlook联系人窗口会关闭Outlook本身(错误)

我建议将Outlook项目的id保留在控件的Tag属性中。因此,您将能够用任何Outlook实例恢复它们(即使它已经消失)。Namespace类的GetItemFromID方法返回由指定条目ID标识的Microsoft Outlook项目(如果有效)。有关条目ID的更多信息,请参阅EntryID属性:

当在MAPI存储提供程序的存储中创建项目时,它会分配一个唯一的ID字符串。因此,在保存或发送Outlook项目之前,不会为其设置EntryID属性。当项目移动到另一个存储时,条目ID会发生更改,例如,从收件箱移动到Microsoft Exchange Server公用文件夹,或从一个个人文件夹(.pst)文件移动到另个.pst文件。除非不会移动项目,否则解决方案不应依赖于EntryID属性的唯一性。EntryID属性返回MAPI长期条目ID。

Outlook就是这样做的-在最后一个窗口(ExplorerInspector)关闭时关闭自己,即使仍然有对Outlook对象模型对象的引用。唯一的例外是ExplorerInspector对象,即使它们不可见。

尝试从MAPIFolder对象(MAPIFolder.GetExplorer)的实例中检索Explorer对象,并保持对其的引用,直到完成为止。您不必对它做任何操作,只需在全局/类变量中引用它即可。MAPIFolder可以是任何Outlook文件夹,例如Namespace.GetDefaultFolder(olFolderContacts)返回的默认联系人文件夹。