摘要
本文包含一个分步示例,说明如何创建一个 Microsoft Visual Studio 2010 应用程序,该应用程序可自动Microsoft Outlook 2010,并将 C++ 与 Microsoft Foundation Classes (MFC) 一起使用。
更多信息
本文介绍如何创建可自动执行 Outlook 的 Visual Studio 2010 项目,以执行以下操作:
- 创建并保存联系人
- 创建并保存约会
- 创建和发送邮件
虽然可以实现以下所有部分,但也可以省略其中一个或两个部分,以便仅创建一两种类型的项目。
注意
以下所有代码示例都假定文件路径适用于 32 位操作系统。 请确保对路径进行任何必要的更改,使其对特定操作系统和配置有效。 此外,代码还会创建具有虚构信息的 Outlook 项,其中包含虚构的电子邮件地址。 请确保将电子邮件地址更改为有效的电子邮件地址之一以供测试。
步骤 1:创建项目
- 启动 Visual Studio 2010。
- 依次单击“文件”、“新建”和“项目”。 在已安装模板列表中,展开 C++,选择 MFC,然后选择 MFC 应用程序 项目。 将项目命名为 AutomateOutlookWithMFC,然后单击 “确定”。
- 启动 MFC 应用程序向导时,单击 “下一步”。
- 将 MFC 应用程序向导中的设置保留默认值,但应用程序 类型 部分除外。 在本部分中, 选择基于对话框。
- 单击 “完成 ”以完成 MFC 应用程序向导。
步骤 2:包括 Microsoft Office 14.0 对象库
在解决方案资源管理器窗口中,打开 stdafx.h 文件。
在文件末尾,添加以下行。 确保路径适合特定操作系统和配置:
#import "C:\\Program Files\\Common Files\\microsoft shared\\OFFICE14\\mso.dll" no_namespace rename("RGB", "MsoRGB") exclude("IAccessible")
注意 此行指示 MIDL 在没有 IAccessible 接口的情况下创建标头文件,以避免潜在的重新定义错误。 每个类文件都需要此引用。 因此,它包含在 stdafx.h 头文件中。
步骤 3:创建 Outlook 的应用程序对象
在解决方案资源管理器窗口中,选择 AutomateOutlookWithMFCDlg.cpp 文件。
单击 “项目” 菜单,然后单击 “类向导”。
单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 TypeLib 的 MFC 类”。
在 “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。
在 “接口 ”列表框中,单击 _Application。
单击向右键按钮 可将_Application 添加到 “生成的类”列表。
单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。
打开新创建的标头文件 CApplication.h。 找到此行:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
将步骤 8 中所在的行替换为以下内容:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
打开 AutomateOutlookWithMFCDlg.cpp 文件,然后将以下内容添加到#include语句列表:
#include "CApplication.h"
步骤 4:向项目添加按钮
切换到对话框。
使用“控件工具箱”将按钮添加到对话框。
若要为按钮添加处理程序,请双击该按钮并找到此行:
// TODO: Add your control notification handler code here
将步骤 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 的命名空间对象
在 “项目” 菜单中,单击 “类向导”。
单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。
在 “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。
在 “接口 ”列表框中,单击 _Namespace。
单击右箭头按钮,将 _Namespace 添加到 “生成的类”列表。
单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。
打开新创建的标头文件 CNamespace.h。 找到此行:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
将步骤 7 中所在的行替换为以下内容:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
切换到 AutomateOutlookWithMFCDlg.cpp 文件,并将以下内容添加到#include语句列表:
#include "CNamespace.h"
在 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
在 “项目” 菜单中,单击 “类向导”。
单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。
在 “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。
在 “接口 ”列表框中,单击 _ContactItem。
单击右箭头按钮,将 _ContactItem 添加到 “生成的类”列表。
单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。
打开新创建的标头文件 CContactItem.h。 找到此行:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
将步骤 7 中所在的行替换为以下内容:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
切换到 AutomateOutlookWithMFCDlg.cpp 文件,然后将以下内容添加到#include语句列表:
#include "CContactItem.h"
在 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
在 “项目” 菜单中,单击 “类向导”。
单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。
在 “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。
在 “接口 ”列表框中,单击 _AppointmentItem。
单击右箭头按钮,将 _AppointmentItem 添加到 “生成的类”列表。
单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。
打开新创建的标头文件 CAppointmentItem.h。 找到此行:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
将步骤 7 中所在的行替换为以下内容:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
切换到 AutomateOutlookWithMFCDlg.cpp 文件,并将以下内容添加到#include语句列表:
#include "CAppointmentItem.h"
在 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
在 “项目” 菜单中,单击 “类向导”。
单击 “添加类 ”按钮上的向下箭头,然后单击 “来自 Typelib 的 MFC 类”。
在 “可用类型库”下,选择 “Microsoft Outlook 14.0 对象库”。
在 “接口 ”列表框中,单击 _MailItem。
单击右箭头按钮,将 _MailItem 添加到 “生成的类”列表。
单击 “完成 ”生成类,然后单击 “确定 ”关闭类向导。
打开新创建的标头文件 CMailItem.h。 找到此行:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace
将步骤 7 中所在的行替换为以下内容:
#import "C:\\Program Files\\Microsoft Office\\Office14\\msoutl.olb" no_namespace rename("Folder", "OlkFolder") rename("CopyFile", "OlkCopyFile") rename("GetOrganizer", "GetOrganizerAE")
切换到 AutomateOutlookWithMFCDlg.cpp 文件,并将以下内容添加到#include语句列表:
#include "CMailItem.h"
在 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:编译并运行项目
- 在"构建"菜单上,单击"构建解决方案"。 确保没有生成错误。
- 编译并运行代码。 它应创建并保存联系人和约会,然后创建并发送新的电子邮件。
其他注意事项
正在重命名三种方法,以避免编译时出现潜在冲突。 尽管文件夹和 CopyFile 方法生成警告,但 GetOrganizer 方法将阻止项目编译。
_Appointment::GetOrganizer 方法返回 AddressEntry,并重命名为_Appointment::GetOrganizerAE。 之所以重命名此方法,是因为 _Appointment::Organizer 是同一接口上的一个属性,重复会导致冲突。 在这种情况下,MIDL 为名为 _Appointment::GetOrganizer 的 _Appointment::Organizer 属性创建帮助程序函数。 因此,帮助程序函数将成为一个重载方法,该方法返回不同类型 (例如 BSTR* 与 AddressEntry*) 。 不允许使用仅因返回类型而异的重载方法。