【问题标题】:MAPILogonEx(...) returns NULL while calling from MAPILogOn(...)MAPILogonEx(...) 从 MAPILogOn(...) 调用时返回 NULL
【发布时间】:2016-11-21 21:02:01
【问题描述】:

我正在创建默认邮件应用程序,例如 Thunderbird 和 Outlook,但仅具有一些功能。所以现在的问题只有单词 2007 和 excel 2007 从 fileMenu -> 发送 -> 电子邮件发送文件时,单击电子邮件后应用程序崩溃,但同样的事情在 Powerpoint 2007 和一个笔记 2007 中工作。

在 Office 2007 中,MapiLogon(...) 得到第一个调用,这是我的 MAPILogOn(...),

// I have used ofstream for the log purpose.
#include <MAPIX.h>

extern "C" ULONG MAPILogon(ULONG_PTR ulUIParam, LPSTR lpszProfileName, LPSTR lpszPassword, FLAGS flFlags, ULONG ulReserved, LPLHANDLE lplhSession)
{
    ofstream outfile;
    outfile.open("e:\\temp\\MAPILogon.txt");

    HRESULT hrs = NULL;

    MAPIINIT_0  MAPIINIT = { MAPI_INIT_VERSION, MAPI_NO_COINIT };
    hrs = MAPIInitialize(NULL);
    lplhSession = nullptr;
    if (hrs != S_OK)
    {
        outfile << "\n MAPI uniititalized";
    }
    else
    {
        outfile << "\n MAPI initialized";

        LPMAPISESSION FAR spSession = NULL;
        outfile << "\n lplhsession - " << spSession;
        hrs = MAPILogonEx(NULL, "Outlook", NULL, MAPI_EXTENDED | MAPI_NEW_SESSION, &spSession);
        if (hrs == NULL)
        {
            outfile << "\n MAPI problem while log in." << spSession;
        }
        else if (hrs == S_OK)
        {
            outfile << "\n MAPI log in successful.";
            return SUCCESS_SUCCESS;
        }

        outfile << "\n Last Error - " << GetLastError();
    }
    return MAPI_E_FAILURE;
}

这里,我可以成功初始化MAPI,但是MAPILogOnEx(...)返回null,那么这里还有什么需要的吗?

GetLastError() 给出 0。“Outlook”是默认配置文件。

我看过stackoverflow和微软的所有教程,但没有找到解决办法。

【问题讨论】:

    标签: c++ mapi office-2007 windows-messages


    【解决方案1】:

    MAPILogonEx 返回 HRESULT,而不是指针。 if (hrs == NULL)if (hrs == S_OK) 行是相同的,因为编译器会将 NULL 转换为 0。 S_OK 也是 0。

    【讨论】:

    • 是的,你是对的,我测试了这个东西,NULL和S_OK都是一样的。
    • 看看解决办法,我写到这里了。但问题是 office 2007 应用程序正在调用 MAPILonOn(...) 并且我没有在其中做任何事情仍然代码对解决方案很好,所以为什么 office 2007 应用程序正在调用 MAPILogOn(...) 而其他 office 版本应用程序直接调用 MAPISendMail(...) 或 MAPISendMailW(...)
    • MAPILonOn 是 Simple MAPI,你为什么需要它?
    • 我正在使用简单的 MAPI 来使用 Windows 功能“发送到”,我认为我不需要在这里扩展 MAPI。我必须使用扩展 MAPI 吗?
    • 我不知道,取决于你想要做什么。
    【解决方案2】:

    我将函数定义更改为此 - 使用以下解决方案,我不需要 MAPIInitialize 和 MAPILogOnEx。

    #define WINAPI      __stdcall
    #define SUCCESS_SUCCESS         0
    
    extern "C" ULONG WINAPI MAPILogon(ULONG_PTR ulUIParam, LPSTR lpszProfileName, LPSTR lpszPassword, FLAGS flFlags, ULONG ulReserved, LPLHANDLE lplhSession)
    {
        return Success_Success;
    }
    

    我添加了带有以下行的 .def 文件 -

    ; file_name.def
    LIBRARY file_name
    EXPORTS
        MAPILogoff
        MAPILogon
        MAPISendDocuments
        MAPISendMail
        MAPISendMailW
    

    这是我唯一需要的功能。因此,office 2007 正在调用此函数的修饰名称,如果没有此函数,office 2007 将无法找到函数,因此如果不给出消息,office 2007 应用程序就会崩溃。现在它正在工作。现在我必须用所有的 office 版本和所有的操作系​​统来测试相同的代码。让我们希望它能奏效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2021-08-06
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多