我在程序中调用了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;
}

解决方案 »

  1.   

    在Loutu notes中设置为默认邮件处理, 在IE中设置的只是mailto协议.
      

  2.   

    是吗?
    但是如果我把测试程序退出再打开,前面的代码就能够打开上次设置的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的。
      

  3.   

    你的意思是: 调用邮件发送程序正在运行, 然后, 改变IE设置里的"默认邮件程序"设置?
    结果, 调用邮件MAPI还是设置前的默认处理程序,是这样吗?在MAPISendMail标志位加上MAPI_NEW_SESSION试试!
      

  4.   

    是你说的这个意思,不过加了MAPI_NEW_SESSION还是不行
      

  5.   

    打开OutLook > 设置 > 其它去掉"将Outlook设为邮件默 认程序"试下...
      

  6.   

    还是不行,估计不是这里的原因。奇怪的是把测试程序关掉再打开就好的,这应该和每次点一下SendMail button一样啊,因为我每次点button都会load和free mapi dll.
      

  7.   

    你的主要MAPI程序是在DLL中被调用的吗?
      

  8.   

    每次调用时, 试下动态加载/释放你的dll库(包含MAPI调用)...
      

  9.   

    这个不满足我的需求,因为我的Dll有很多函数,不可能单独为这个函数封装一个dll,而且这种方法也不一定有效,我感觉和进程初始化有关系,不知道是不是MAPI的bug。
      

  10.   

    我是说,你写个简单的测试主程序, 然后,动态加载你自已写的dll,然后,对MAPI调用进行测试一下/
      

  11.   

    测试结果一样,无法打开更改后的email client.