use*_*436 3 windows unicode mapi winapi
在我看来,MAPI(Windows Mail API)存在UTF8问题(或者我做错了).
代码示例:
HMODULE m_hLib = LoadLibraryA("MAPI32.DLL");
if (m_hLib == NULL)
return SEND_MAIL_CANCELED;
LPMAPISENDMAIL SendMail;
SendMail = (LPMAPISENDMAIL) GetProcAddress(m_hLib, "MAPISendMail");
if (!SendMail)
return;
MapiFileDesc fileDesc;
ZeroMemory(&fileDesc, sizeof(fileDesc));
fileDesc.nPosition = (ULONG) -1;
fileDesc.lpszPathName = (LPSTR) filePath.toUtf8();
fileDesc.lpszFileName = (LPSTR) fileName.toUtf8();
MapiRecipDesc recipientData;
ZeroMemory(&recipientData, sizeof(recipientData));
recipientData.lpszName = (LPSTR) recipient.toUtf8();
recipientData.ulRecipClass = MAPI_TO;
MapiMessage message;
ZeroMemory(&message, sizeof(message));
message.ulReserved = CP_UTF8;
message.lpszSubject = (LPSTR) title.toUtf8();
message.nFileCount = 1;
message.lpFiles = &fileDesc;
message.nRecipCount = 1;
message.lpRecips = &recipientData;
int nError = SendMail(0, NULL, &message, MAPI_LOGON_UI | MAPI_DIALOG, 0);
Run Code Online (Sandbox Code Playgroud)
title,filePath,fileName和recipient都是std::string秒.据我所知,UTF8与ASCII兼容(也是NULL终止),因此它的字符串可以保存这些值而没有任何问题.
我用这种方式从wstring转换为UTF8:
int requiredSize = WideCharToMultiByte(CP_UTF8, 0, data.c_str(), -1, 0, 0, 0, 0);
if(requiredSize > 0)
{
std::vector<char> buffer(requiredSize);
WideCharToMultiByte(CP_UTF8, 0, data.c_str(), -1, &buffer[0], requiredSize, 0, 0);
this->container.append(buffer.begin(), buffer.end() - 1);
}
Run Code Online (Sandbox Code Playgroud)
container是一个std::string对象.
MAPISendMail()不支持UTF-8,只支持Ansi.如果需要发送Unicode数据,则必须MAPISendMailHelper()在Windows 7及更早版本或MAPISendMailW()Windows 8及更高版本上使用.这在MAPISendMail()文档中有明确说明.
在旁注中,WideCharToMultiByte()将cchWideChar参数设置为-1 时包含null终止符.因此,您正在编码并在container数据中包含该null终止符.您应该设置cchWideChar为字符串的实际长度以完全避免null终止符:
int requiredSize = WideCharToMultiByte(CP_UTF8, 0, data.c_str(), data.length(), 0, 0, 0, 0);
if (requiredSize > 0)
{
std::vector<char> buffer(requiredSize);
WideCharToMultiByte(CP_UTF8, 0, data.c_str(), data.length(), &buffer[0], requiredSize, 0, 0);
container.append(buffer.begin(), buffer.end());
}
Run Code Online (Sandbox Code Playgroud)
在http://msdn.microsoft.com/en-us/library/windows/desktop/dd296721.aspx上,它指出"在Windows 7及更早版本:使用MAPISendMailHelper发送消息",但位于http:// msdn的底部.microsoft.com/en-us/library/windows/desktop/hh802867.aspx它声明"支持的最低限度"是Windows 8.看起来像是矛盾的信息,因此不清楚MAPISendMailHelper是否真的适用于Windows 7及更早版本.
| 归档时间: |
|
| 查看次数: |
3324 次 |
| 最近记录: |