MAPILogonEx(...)在从MAPILogOn(...)调用时返回NULL
问题描述:
我正在创建类似thunderbird和Outlook的默认邮件应用程序,但仅包含一些功能。所以,现在的问题是,只有在Word 2007和Excel 2007中,从fileMenu发送文件 - >发送 - >电子邮件和应用程序在点击电子邮件后崩溃,但同样的事情在Powerpoint 2007和一个笔记2007中工作。MAPILogonEx(...)在从MAPILogOn(...)调用时返回NULL
与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”是默认配置文件。
我查看了所有的教程*和微软,但无法获得解决方案。
答
MAPILogonEx返回HRESULT,而不是指针。行if (hrs == NULL)
和if (hrs == S_OK)
是相同的,因为编译器将NULL转换为0。 S_OK也是0.
答
我改变了函数的定义 - 以下面的解决方案我不需要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应用程序就会崩溃。现在它正在工作。现在我必须测试所有办公版本和所有操作系统的相同代码。让我们希望它的工作。
是的你是正确的,我测试了这个东西,并且NULL和S_OK都是一样的。 –
看看我写在这里的解决方案。但事情是办公室2007年的应用程序调用MAPILonOn(...),我没有做任何事情,仍然代码是好的解决方案,所以为什么Office 2007应用程序调用MAPILogOn(...),而其他Office版本应用程序直接调用MAPISendMail(...)或MAPISendMailW(...) –
MAPILonOn是简单的MAPI,你为什么需要它? –