我在程序中调用了MAPI - MAPISendMail来打开一个默认的邮件发送窗口,碰到一个问题,如果当前默认的email type是MS Outlook, 我在IE的设置里把默认email改成Lotus notes, 再调用该函数,打开的却还是MS Outlook的email窗口(正确结果应该是打开一个Lotus Notes email窗口),不知道有谁碰到过这类问题,如果有解决方案烦请吱一声:),谢谢!我的代码如下:void CSMAPI_TestDlgDlg::OnSendMail()
{
HINSTANCE hMAPI = LoadLibrary("MAPI32.DLL");
if (NULL == hMAPI)
return;
LPMAPISENDMAIL lpfnSendMail = (LPMAPISENDMAIL)GetProcAddress(hMAPI, "MAPISendMail");
if (NULL == lpfnSendMail)
return;
// prepare the message
MapiMessage message;
memset(&message, 0, sizeof(message));
message.nRecipCount = 0/*1*/;
message.lpRecips = NULL/*&rec*/;
message.lpszSubject = "mailto: subject";
message.lpszNoteText = "test";
// send mail.
lpfnSendMail(0, (ULONG)GetSafeHwnd(), &message, MAPI_LOGON_UI | MAPI_DIALOG, 0); FreeLibrary(hMAPI);
hMAPI = NULL;
}
{
HINSTANCE hMAPI = LoadLibrary("MAPI32.DLL");
if (NULL == hMAPI)
return;
LPMAPISENDMAIL lpfnSendMail = (LPMAPISENDMAIL)GetProcAddress(hMAPI, "MAPISendMail");
if (NULL == lpfnSendMail)
return;
// prepare the message
MapiMessage message;
memset(&message, 0, sizeof(message));
message.nRecipCount = 0/*1*/;
message.lpRecips = NULL/*&rec*/;
message.lpszSubject = "mailto: subject";
message.lpszNoteText = "test";
// send mail.
lpfnSendMail(0, (ULONG)GetSafeHwnd(), &message, MAPI_LOGON_UI | MAPI_DIALOG, 0); FreeLibrary(hMAPI);
hMAPI = NULL;
}
但是如果我把测试程序退出再打开,前面的代码就能够打开上次设置的Lotus Notes email窗口了。也就是说,只有这个测试程序不退出的情况下,去IE设置里更改默认的email client从MS Outlook到其他email client(eg. lotus notes/Outlook Express/Hotmail, ...),无法打开更改后的email client. 这种情况下从默认不是MS Outlook的email client更改到任何其他的也是OK的,不知道是什么原因。PS: 右击桌面上的一个文件,选择“发送到邮件接收者”,打开的窗口也是OK的。
结果, 调用邮件MAPI还是设置前的默认处理程序,是这样吗?在MAPISendMail标志位加上MAPI_NEW_SESSION试试!