Создание Custom Simple Mapi DLL, происходит сбой при выполнении

Мне нужно создать небольшую DLL для перехвата простых вызовов Mapi и отправки файлов через:

file-> Send to as attachment (в Excel, Word, Acrobat Reader …)
или через проводник-> rightclickmenu-> Отправить-> Получатель почты

прикрепить к gmail.

после прочтения этого:

Настройки реестра заглушки Mapi32.dll (Windows)

Библиотека-заглушка Mapi32 (Windows)

и поиск здесь на stackoverflow и других веб-сайтах я создал одну очень маленькую dll, используя code :: blocks, которая показывает мне информацию для исследования процесса.

Я правильно установил его в реестре, как указано в предыдущих ссылках на HKEY_LOCAL_MACHINE \ SOFTWARE \ Clients \ Mail \ SimpMapi.

Я выбрал на моем Win XP XP Pro в панели управления-> Свойства обозревателя мой клиент SimpMapi.

когда я открываю Excel, пишу несколько ячеек и захожу в File-> Send as attachment. dll показывает мне, что сначала вызывает MapiLogon, второй вызывает MapiSendMail, а третий, когда я закрываю Excel, вызывает MapiLogoff, но затем выдает ошибку и закрывает Excel.exe.

Если я попробую его из окна проводника, щелкнув правой кнопкой мыши по одному файлу и получателю SendTo-> Mail, он вызовет непосредственно MapiSendMail, и когда я нажму на ok в MsgBox, он выдаст ошибку и закроет explorer.exe.

Не могли бы вы помочь мне выяснить, что не так.

Это файл mail.h:

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

// Todo lo necesario a incluir por mapi.h
#define SUCCESS_SUCCESS         0
#define MAPI_E_USER_ABORT       1
#define MAPI_E_LOGIN_FAILURE    3

typedef unsigned long FLAGS;
typedef unsigned long LHANDLE;
typedef unsigned long FAR *LPLHANDLE, FAR *LPULONG;

typedef struct {
ULONG ulReserved;
ULONG ulRecipClass;
LPSTR lpszName;
LPSTR lpszAddress;
ULONG ulEIDSize;
LPVOID lpEntryID;
} MapiRecipDesc, *lpMapiRecipDesc;

typedef struct {
ULONG ulReserved;
ULONG flFlags;
ULONG nPosition;
LPSTR lpszPathName;
LPSTR lpszFileName;
LPVOID lpFileType;
} MapiFileDesc, *lpMapiFileDesc;

typedef struct {
ULONG ulReserved;
LPSTR lpszSubject;
LPSTR lpszNoteText;
LPSTR lpszMessageType;
LPSTR lpszDateReceived;
LPSTR lpszConversationID;
FLAGS flFlags;
lpMapiRecipDesc lpOriginator;
ULONG nRecipCount;
lpMapiRecipDesc lpRecips;
ULONG nFileCount;
lpMapiFileDesc lpFiles;
} MapiMessage, *lpMapiMessage;/*  To use this exported function of dll, include this header
*  in your project.
*/

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

extern "C" void DLL_EXPORT SomeFunction(const LPCSTR sometext);

extern "C" ULONG DLL_EXPORT MAPILogon(ULONG_PTR ulUIParam,LPSTR lpszProfileName,LPSTR lpszPassword,FLAGS flFlags,ULONG ulReserved,LPLHANDLE lplhSession);
extern "C" ULONG DLL_EXPORT MAPILogoff(LHANDLE lhSession,ULONG_PTR ulUIParam,FLAGS flFlags,ULONG ulReserved);
extern "C" ULONG DLL_EXPORT MAPISendDocuments(ULONG_PTR ulUIParam,LPSTR lpszDelimChar,LPSTR lpszFilePaths,LPSTR lpszFileNames,ULONG ulReserved);
extern "C" ULONG DLL_EXPORT MAPISendMail(LHANDLE lhSession,ULONG_PTR ulUIParam,lpMapiMessage lpMessage,FLAGS flFlags,ULONG ulReserved);

#endif

Это файл main.cpp:

#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
ULONG DLL_EXPORT MAPILogon(ULONG_PTR ulUIParam,LPSTR lpszProfileName,LPSTR lpszPassword,FLAGS flFlags,ULONG ulReserved,LPLHANDLE lplhSession)
{
MessageBoxA(0, "MAPILogon", "MAPILogon", MB_OK | MB_ICONINFORMATION);
return SUCCESS_SUCCESS;
}
ULONG DLL_EXPORT MAPILogoff(LHANDLE lhSession,ULONG_PTR ulUIParam,FLAGS flFlags,ULONG ulReserved)
{
MessageBoxA(0, "MAPILogoff", "MAPILogoff", MB_OK | MB_ICONINFORMATION);
return SUCCESS_SUCCESS;
}
ULONG DLL_EXPORT MAPISendDocuments(ULONG_PTR ulUIParam,LPSTR lpszDelimChar,LPSTR lpszFilePaths,LPSTR lpszFileNames,ULONG ulReserved)
{
MessageBoxA(0, "MAPISendDocuments", "MAPISendDocuments", MB_OK | MB_ICONINFORMATION);
return SUCCESS_SUCCESS;
}
ULONG DLL_EXPORT MAPISendMail(LHANDLE lhSession,ULONG_PTR ulUIParam,lpMapiMessage lpMessage,FLAGS flFlags,ULONG ulReserved)
{
MessageBoxA(0, "MAPISendMail", "MAPISendMail", MB_OK | MB_ICONINFORMATION);
return SUCCESS_SUCCESS;
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;

case DLL_PROCESS_DETACH:
// detach from process
break;

case DLL_THREAD_ATTACH:
// attach to thread
break;

case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}

Заранее спасибо.

Jorge

0

Решение

В ссылке: Создание Custom Simple Mapi DLL, выдает ошибку при выполнении

Энди помог мне решить проблему с неправильным соглашением о вызовах.

Добавление WINAPI ко всем моим объявлениям и определениям функций Simple MAPI, например:

extern "C" ULONG DLL_EXPORT WINAPI MAPILogon( // etc

Тогда проблема была в том, что мои экспортированные функции были экспортированы с объявлениями.

Чтобы исправить это в code :: blocks, вы должны добавить:

Главное меню: Проект -> Параметры сборки -> Компилятор GNU GCC -> Настройки компоновщика -> Другие опции компоновщика: -Wl, — kill-at

Спасибо!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]