【问题标题】:MAPI and Outlook address bookMAPI 和 Outlook 通讯簿
【发布时间】:2014-08-12 17:42:37
【问题描述】:

我正在使用 VC++ (MSDEV 2008) 开发一个项目,该项目具有发送带有一些附件的 EMAIL 的功能。我使用 MAPI 函数来完成这项任务。

我使用项目设置“字符集:使用 Unicode 字符集”来构建项目,以获得 UNICODE 兼容支持,文件类型为 EXE 扩展名。在这里一切正常。

我构建的项目与 OCX 文件扩展名相同。我可以显示带有一些附件的“新发送邮件”窗口。问题出在这里

当我单击地址簿图标(“收件人”按钮)从列表中选择收件人邮件 ID 时。它显示地址簿对话框,标题只有“S”而不是“选择名称:*”。但这在 EXE 项目中也可以正常工作。

代码:

HWND hWnd = this->GetSafeHwnd();
MAPIINIT_0 tMapInit = { 0, MAPI_MULTITHREAD_NOTIFICATIONS };
HRESULT hResult = MAPIInitialize( &tMapInit );
HMODULE hMapiMod = LoadLibrary(_T("mapi32.dll"));

ProcMapiLogon = (LPMAPILOGON)GetProcAddress( hMapiMod, "MAPILogon" );

(ProcMapiLogon)( (ULONG)hWnd, NULL, NULL, MAPI_LOGON_UI | MAPI_NEW_SESSION, 0,   &hCurrentSession );


LPMAPISENDMAIL ProcMapiSendMail = NULL;
ProcMapiSendMail = (LPMAPISENDMAIL)GetProcAddress(hMapiMod, "MAPISendMail");
(ProcMapiSendMail)(hCurrentSession, (ULONG)hWnd, &myMsg, MAPI_DIALOG | MAPI_LOGON__UI, 0);

问题是为什么地址簿对话框的标题在 OCX 项目中只显示“S”。同样适用于 exe 项目。

请帮我解决问题。

补充说明:

感谢您的回复。

使用简单的 MAPI 代码,除了“地址簿”对话框的标题(标题)之外,一切正常(意味着我可以显示新的发送邮件窗口并在单击“发送”按钮时发送它)。

我也尝试了扩展的 MAPI 功能。当项目构建为 .OCX 文件扩展名(如“SendMail.ocx”)时,地址簿对话框的标题仍仅显示“S”。

扩展 MAPI 代码:

HMODULE hMapiMod = LoadLibrary(_T("mapi32.dll"));
LPMAPISESSION lppSession;
LPMAPILOGONEX ProcMapiLogonEx = NULL;
ProcMapiLogonEx = (LPMAPILOGONEX)GetProcAddress( hMapiMod, "MAPILogonEx" );
ProcMapiLogonEx)( (ULONG)hWnd, NULL, NULL, MAPI_USE_DEFAULT | MAPI_UNICODE |  MAPI_EXTENDED | MAPI_LOGON_UI | MAPI_NEW_SESSION, &lppSession );

【问题讨论】:

    标签: visual-studio unicode outlook mapi


    【解决方案1】:

    简单 MAPI 仅是 ANSI。外部 MAPI dll 不知道您编译为 Unicode,它所看到的只是一个它期望以 0x0 终止的字符串。您的 Unicode(2 字节)字符串的每个 ANSI 字符都有 0x0,末尾有双 0x0。因此,您的字符串在第一个 0x0 处终止。

    【讨论】:

    • 我在帖子中添加了附加说明。请告诉我为什么它在 AxtiveX contorl (.ocx) 项目中不起作用,我应该进行任何其他设置。