我正在开发一个项目使用VC++ (MSDEV 2008),它有一个功能,发送电子邮件与一些附件。我使用MAPI函数来完成这个任务。
我构建的项目设置为“字符集:使用Unicode字符集”以支持UNICODE兼容,文件类型为EXE扩展名。这里一切都很好。
与我构建的OCX文件扩展名相同的项目。我还可以显示带有附件的“新发送邮件”窗口。这里的问题是
当我单击地址簿图标(" to“按钮)从列表中选择接收者邮件id时。它只显示标题为"S“的地址簿对话框,而不是"Select:*”。但这在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);问题是为什么Address对话框的标题在OCX项目中只显示“S”。同样,它也能在exe项目中工作。
请帮我解决这个问题。
补充说明:
感谢您的回复。
使用简单的MAPI代码,除了“地址簿”对话框的标题(标题)之外,一切都可以正常工作(这意味着我可以显示新的发送邮件窗口并在单击“send”按钮时发送它)。
我还尝试了扩展的MAPI功能。当项目构建为.OCX时,像“SendMail.ocx”这样的文件扩展名仍然是Address对话框,标题只显示“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 );发布于 2014-08-12 05:49:17
简单的MAPI仅限于ANSI。外部MAPI不知道您是以Unicode的形式编写的,它看到的只是一个字符串,它希望该字符串终止于0x0。您的Unicode (2字节)字符串对于每个ANSI字符都有0x0,在末尾有双0x0。因此,您的字符串在第一个0x0处终止。
https://stackoverflow.com/questions/25256933
复制相似问题