这是我的Visual C ++包装器,用于初始化自己的DLL库:
void COutlookManagerEx::Init()
{
throw_if_fail(m_pInterface.CreateInstance(__uuidof(PTSOutlookLibrary::PTSOutlookLibraryClass)));
if (IsValid())
m_pInterface->ShowMicrosoftOutlook();
}
C#构造函数:
public PTSOutlookLibraryClass()
{
try
{
_OutlookApp = new Outlook.Application();
}
catch(Exception /* e */)
{
}
}
用于显示Outlook的C#方法:
public void ShowMicrosoftOutlook()
{
// Show Outlook
if (_OutlookApp.Explorers.Count == 0)
{
Outlook.MAPIFolder oFolder = _OutlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
oFolder.Display();
}
}
我的COutlookManagerEx
是CDialog
的成员变量:
private:
COutlookManagerEx m_OutlookManager;
由于某种原因,当我关闭CDialog
对象时,Microsoft Outlook保持打开状态。
基于similar questions,我尝试过:
public void Terminate()
{
try
{
Marshal.ReleaseComObject(_OutlookApp);
}
catch
{
}
finally
{
_OutlookApp = null;
}
}
添加我自己的包装器,然后在我的对话框关闭但Outlook仍然可见时调用Terminate
。
答案 0 :(得分:1)
实例化它时,是否在Outlook中运行任何VBA宏? VBA是您的选择吗?我在后台使用Excel进行自动化,并且发现使用VB Script实例化程序,然后从Excel内部或通过VB Script接口执行VBA时,可以获得最可靠的结果。这样,我可以在后台运行VBS脚本,并且可以利用诸如 DisplayAlerts 和 Quit 之类的VBA命令隐藏内容或退出软件。我还可以通过利用凭据存储并以具有访问文件所需权限的用户身份执行VBS来解决用户访问问题(因为VBS会使用自己执行时提供的凭据来启动COM对象。)
但是,无论选择使用哪种包装,都应在关闭COM对象之前向Outlook发送一个quit命令。我发现如果不先退出Excel,然后再关闭COM对象,则该软件可能会一直保持打开状态,尤其是在期望某种用户输入的情况下(IE: “你确定你要退出吗?”)。当然,在频谱的另一端,如果您调用“ Quit”但不杀死您的COM对象,则会有一个挂起的进程。
退出操作的顺序应从下至上。退出Outlook,然后终止COM对象,然后结束程序。
不支持Outlook,Excel和所有其他Office套件程序的自动化。除非您要自动化某种旧式脚本,或者与不熟悉(或不熟悉)编写软件的人一起工作,否则您应该利用Microsoft Office现在遵循开放式办公套件标准的事实:
https://support.microsoft.com/en-us/help/257757/considerations-for-server-side-automation-of-office
您对C#感到满意,并且所有Office文档都是XML文件。如果要发送或接收电子邮件,则可以使用内置于C#中的SMTP客户端,或者实现可以完成所需工作的东西。如果您要构建新的东西,强烈建议您远离Office Automation。
答案 1 :(得分:0)
Outlook在其最后一个窗口关闭时关闭。您的代码在资源管理器中显式显示“收件箱”文件夹。 Outlook将保持打开状态,直到关闭该窗口。