如何在 Visual Studio 2010 中结合使用 C++ 和 MFC 自动执行 Outlook 2010

摘要

本文包含一个分步示例,说明如何创建一个 Microsoft Visual Studio 2010 应用程序,该应用程序可自动Microsoft Outlook 2010,并将 C++ 与 Microsoft Foundation Classes (MFC) 一起使用。

更多信息

本文介绍如何创建可自动执行 Outlook 的 Visual Studio 2010 项目,以执行以下操作:

  • 创建并保存联系人
  • 创建并保存约会
  • 创建和发送邮件

虽然可以实现以下所有部分,但也可以省略其中一个或两个部分,以便仅创建一两种类型的项目。

注意

以下所有代码示例都假定文件路径适用于 32 位操作系统。 请确保对路径进行任何必要的更改,使其对特定操作系统和配置有效。 此外,代码还会创建具有虚构信息的 Outlook 项,其中包含虚构的电子邮件地址。 请确保将电子邮件地址更改为有效的电子邮件地址之一以供测试。

步骤 1:创建项目

  1. 启动 Visual Studio 2010。
  2. 依次单击“文件”、“新建”和“项目”。 在已安装模板列表中,展开 C++,选择 MFC,然后选择 MFC 应用程序 项目。 将项目命名为 AutomateOutlookWithMFC,然后单击 “确定”。
  3. 启动 MFC 应用程序向导时,单击 “下一步”。
  4. 将 MFC 应用程序向导中的设置保留默认值,但应用程序 类型 部分除外。 在本部分中, 选择基于对话框
  5. 单击 “完成 ”以完成 MFC 应用程序向导。

步骤 2:包括 Microsoft Office 14.0 对象库

  1. 在解决方案资源管理器窗口中,打开 stdafx.h 文件。

  2. 在文件末尾,添加以下行。 确保路径适合特定操作系统和配置:

    #import "C:\\Program Files\\Common Files\\microsoft shared\\OFFICE14\\mso.dll" no_namespace rename("RGB", "MsoRGB") exclude("IAccessible")
    

    注意 此行指示 MIDL 在没有 IAccessible 接口的情况下创建标头文件,以避免潜在的重新定义错误。 每个类文件都需要此引用。 因此,它包含在 stdafx.h 头文件中。

步骤 3:创建 Outlook 的应用程序对象

  1. 在解决方案资源管理器窗口中,选择 AutomateOutlookWithMFCDlg.cpp 文件。

  2. 单击 “项目” 菜单,然后单击 “类向导”。

  3. 单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 TypeLib 的 MFC 类”。

  4. “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。

  5. “接口 ”列表框中,单击 _Application

  6. 单击向右键按钮 可将_Application 添加到 “生成的类”列表。

  7. 单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。

  8. 打开新创建的标头文件 CApplication.h。 找到此行:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
    
  9. 将步骤 8 中所在的行替换为以下内容:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
    
  10. 打开 AutomateOutlookWithMFCDlg.cpp 文件,然后将以下内容添加到#include语句列表:

    #include "CApplication.h"
    

步骤 4:向项目添加按钮

  1. 切换到对话框。

  2. 使用“控件工具箱”将按钮添加到对话框。

  3. 若要为按钮添加处理程序,请双击该按钮并找到此行:

    // TODO: Add your control notification handler code here
    
  4. 将步骤 3 中所在的行替换为以下代码:

    CApplication olApp;
    COleException e;
    if (!olApp.CreateDispatch(_T("Outlook.Application"), &e))
    {
    CString strErr;
    strErr.Format(_T("CreateDispatch() failed w/error 0x%08lx"), e.m_sc);
    AfxMessageBox(strErr, MB_SETFOREGROUND);
    return;
    }
    

步骤 5:创建 Outlook 的命名空间对象

  1. “项目” 菜单中,单击 “类向导”。

  2. 单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。

  3. “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。

  4. “接口 ”列表框中,单击 _Namespace

  5. 单击右箭头按钮,将 _Namespace 添加到 “生成的类”列表。

  6. 单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。

  7. 打开新创建的标头文件 CNamespace.h。 找到此行:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
    
  8. 将步骤 7 中所在的行替换为以下内容:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
    
  9. 切换到 AutomateOutlookWithMFCDlg.cpp 文件,并将以下内容添加到#include语句列表:

    #include "CNamespace.h"
    
  10. 在 AutomateOutlookWithMFCDlg::OnBnClickedButton1 () 函数 (按钮处理程序代码) 中,将此代码添加到最后一行之后:

    // Logon. Doesn't hurt if you are already running and logged on... 
    CNameSpace olNs(olApp.GetNamespace(_T("MAPI")));
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    olNs.Logon(covOptional, covOptional, covOptional, covOptional);
    

步骤 6:创建并保存 ContactItem

  1. “项目” 菜单中,单击 “类向导”。

  2. 单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。

  3. “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。

  4. “接口 ”列表框中,单击 _ContactItem

  5. 单击右箭头按钮,将 _ContactItem 添加到 “生成的类”列表。

  6. 单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。

  7. 打开新创建的标头文件 CContactItem.h。 找到此行:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
    
  8. 将步骤 7 中所在的行替换为以下内容:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
    
  9. 切换到 AutomateOutlookWithMFCDlg.cpp 文件,然后将以下内容添加到#include语句列表:

    #include "CContactItem.h"
    
  10. 在 AutomateOutlookWithMFCDlg::OnBnClickedButton1 () 函数 (按钮处理程序代码) 中,将此代码添加到最后一行之后:

    // Create and open a new contact
    CContactItem olContactItem(olApp.CreateItem(olContactItem));
    
    olContactItem.put_FullName(_T("John Doe"));
    COleDateTime bdDate;
    bdDate.SetDate(1975, 9, 15);
    olContactItem.put_Birthday(bdDate);
    olContactItem.put_CompanyName(_T("Microsoft"));
    olContactItem.put_HomeTelephoneNumber(_T("KL5-555-1234"));
    olContactItem.put_Email1Address(_T("john.doe@microsoft.com"));
    olContactItem.put_HomeAddress(_T("123 Main Street.\nAnytown, WA 12345"));
    
    // Save the contact
    olContactItem.Save();
    

步骤 7:创建并保存 AppointmentItem

  1. “项目” 菜单中,单击 “类向导”。

  2. 单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。

  3. “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。

  4. “接口 ”列表框中,单击 _AppointmentItem

  5. 单击右箭头按钮,将 _AppointmentItem 添加到 “生成的类”列表。

  6. 单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。

  7. 打开新创建的标头文件 CAppointmentItem.h。 找到此行:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
    
  8. 将步骤 7 中所在的行替换为以下内容:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
    
  9. 切换到 AutomateOutlookWithMFCDlg.cpp 文件,并将以下内容添加到#include语句列表:

    #include "CAppointmentItem.h"
    
  10. 在 AutomateOutlookWithMFCDlg::OnBnClickedButton1 () 函数 (按钮处理程序代码) 中,将此代码添加到最后一行之后:

    // Create a new appointment
    CAppointmentItem olApptItem(olApp.CreateItem(olAppointmentItem));
    
    COleDateTime apptDate = COleDateTime::GetCurrentTime();
    // Set the Start time to occur 2 minutes from now
    apptDate += DATE(2.0/(24.0*60.0));
    
    olApptItem.put_Start(apptDate);
    
    // Set the duration to be 1 hour
    olApptItem.put_Duration(60);
    
    // Set other appointment info
    olApptItem.put_Subject(_T("Meeting discuss plans"));
    olApptItem.put_Body(_T("Meeting with John to discuss plans"));
    olApptItem.put_ReminderMinutesBeforeStart(1);
    olApptItem.put_ReminderSet(TRUE);
    
    // Save Apptointment
    olApptItem.Save();
    
    

步骤 8:创建并保存 MailItem

  1. “项目” 菜单中,单击 “类向导”。

  2. 单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。

  3. “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。

  4. “接口 ”列表框中,单击 _MailItem

  5. 单击右箭头按钮,将 _MailItem 添加到 “生成的类”列表。

  6. 单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。

  7. 打开新创建的标头文件 CMailItem.h。 找到此行:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
    
  8. 将步骤 7 中所在的行替换为以下内容:

    #import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
    
  9. 切换到 AutomateOutlookWithMFCDlg.cpp 文件,并将以下内容添加到#include语句列表:

    #include "CMailItem.h"
    
  10. 在 AutomateOutlookWithMFCDlg::OnBnClickedButton1 () 函数 (按钮处理程序代码) 中,将此代码添加到最后一行之后:

    // Prepare a new mail message
    CMailItem olMailItem(olApp.CreateItem(olMailItem));
    olMailItem.put_To(_T("john.doe@microsoft.com"));
    olMailItem.put_Subject(_T("About our meeting..."));
    olMailItem.put_Body(
    _T("Hi John,\n\n")
    _T("\tI'll see you in two minutes for our meeting!\n\n")
    _T("btw: I've added you to my contact list!"));
    
    // Send the message
    olMailItem.Send();
    
    AfxMessageBox(_T("All done."), MB_SETFOREGROUND);
    
    

步骤 9:实现要注销的代码

AutomateOutlookWithMFCDlg.cpp 文件的按钮处理程序代码末尾添加以下代码:

olNs.Logoff();

步骤 10:编译并运行项目

  1. 在"构建"菜单上,单击"构建解决方案"。 确保没有生成错误。
  2. 编译并运行代码。 它应创建并保存联系人和约会,然后创建并发送新的电子邮件。

其他注意事项

正在重命名三种方法,以避免编译时出现潜在冲突。 尽管文件夹和 CopyFile 方法生成警告,但 GetOrganizer 方法将阻止项目编译。

_Appointment::GetOrganizer 方法返回 AddressEntry,并重命名为_Appointment::GetOrganizerAE。 之所以重命名此方法,是因为 _Appointment::Organizer 是同一接口上的一个属性,重复会导致冲突。 在这种情况下,MIDL 为名为 _Appointment::GetOrganizer 的 _Appointment::Organizer 属性创建帮助程序函数。 因此,帮助程序函数将成为一个重载方法,该方法返回不同类型 (例如 BSTR* 与 AddressEntry*) 。 不允许使用仅因返回类型而异的重载方法。