Я создаю почтовое приложение по умолчанию, такое как Thunderbird и Outlook, но только с некоторыми функциями. Так что теперь проблема только со словом 2007 и Excel 2007 при отправке файла из fileMenu -> send -> E-mail, и приложение падает после нажатия на E-mail, но то же самое работает в Powerpoint 2007 и одной заметке 2007.
С офисом 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 и Microsoft, но не смог найти решение.
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 аварийно завершают работу. Теперь это работает. Теперь я должен протестировать один и тот же код со всеми офисными версиями и всеми ОС. Будем надеяться, что это сработает.