Eigene Simple Mapi dll - XP Explorer.exe crash



  • Hallo Zusammen,

    ich habe eine eigene "smapi.dll" geschrieben, dass ich die "File.Menu Senden an -> Email Empfänger" Aufrufe abfangen kann.

    Nur gibts bei mir ein kleines Problem, unter XP SP3 32/64 Bit stürzt nachdem "File.Menu Senden an -> Email Empfänger" Aufruf die Explorer.exe ab. Unter Win7 32/64 Bit läuft alles einwandfrei.
    Aus den Windows-Fehlermeldungen werde ich nicht schlau, nun seid Ihr meine Letzte Hoffnung 😃

    MSDN Doku:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd296730%28v=vs.85%29.aspx

    Ich hab all Regestry Einträge gemacht, sonst würde der Aufruf ja nicht passieren.

    So nun zum Code, minimiert mit MessageBox ausgaben:

    #include <windows.h>
    #include <string>
    
    using namespace std;
    
    extern "C" 
    {
    
    	typedef unsigned long FAR * LPULONG;
    	typedef unsigned long       FLAGS;
    
    	typedef ULONG_PTR       LHANDLE, FAR * LPLHANDLE;
    
    	typedef unsigned char FAR * LPBYTE;
    
    	#define    lhSessionNull    ((LHANDLE)0)
    
    	typedef struct
    	{
    		ULONG ulReserved;            /* Reserved for future use (must be 0)     */
    		ULONG flFlags;               /* Flags                                   */
    		ULONG nPosition;             /* character in text to be replaced by attachment */
    		LPSTR lpszPathName;          /* Full path name of attachment file       */
    		LPSTR lpszFileName;          /* Original file name (optional)           */
    		LPVOID lpFileType;           /* Attachment file type (can be lpMapiFileTagExt) */
    	} MapiFileDesc, FAR * lpMapiFileDesc;
    
    	#define MAPI_OLE                0x00000001
    	#define MAPI_OLE_STATIC         0x00000002
    
    	typedef struct
    	{
    		ULONG ulReserved;           /* Reserved, must be zero.                  */
    		ULONG cbTag;                /* Size (in bytes) of                       */
    		LPBYTE lpTag;               /* X.400 OID for this attachment type       */
    		ULONG cbEncoding;           /* Size (in bytes) of                       */
    		LPBYTE lpEncoding;          /* X.400 OID for this attachment's encoding */
    	} MapiFileTagExt, FAR *lpMapiFileTagExt;
    
    	typedef struct
    	{
    		ULONG ulReserved;           /* Reserved for future use                  */
    		ULONG ulRecipClass;         /* Recipient class                          */
    									/* MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG    */
    		LPSTR lpszName;             /* Recipient name                           */
    		LPSTR lpszAddress;          /* Recipient address (optional)             */
    		ULONG ulEIDSize;            /* Count in bytes of size of pEntryID       */
    		LPVOID lpEntryID;           /* System-specific recipient reference      */
    	} MapiRecipDesc, FAR * lpMapiRecipDesc;
    
    	#ifndef MAPI_ORIG				/* also defined in mapix.h */
    	#define MAPI_ORIG   0           /* Recipient is message originator          */
    	#define MAPI_TO     1           /* Recipient is a primary recipient         */
    	#define MAPI_CC     2           /* Recipient is a copy recipient            */
    	#define MAPI_BCC    3           /* Recipient is blind copy recipient        */
    	#endif
    
    	typedef struct
    	{
    		ULONG ulReserved;             /* Reserved for future use (M.B. 0)       */
    		LPSTR lpszSubject;            /* Message Subject                        */
    		LPSTR lpszNoteText;           /* Message Text                           */
    		LPSTR lpszMessageType;        /* Message Class                          */
    		LPSTR lpszDateReceived;       /* in YYYY/MM/DD HH:MM format             */
    		LPSTR lpszConversationID;     /* conversation thread ID                 */
    		FLAGS flFlags;                /* unread,return receipt                  */
    		lpMapiRecipDesc lpOriginator; /* Originator descriptor                  */
    		ULONG nRecipCount;            /* Number of recipients                   */
    		lpMapiRecipDesc lpRecips;     /* Recipient descriptors                  */
    		ULONG nFileCount;             /* # of file attachments                  */
    		lpMapiFileDesc lpFiles;       /* Attachment descriptors                 */
    	} MapiMessage, FAR * lpMapiMessage;
    
    	#define MAPI_UNREAD             0x00000001
    	#define MAPI_RECEIPT_REQUESTED  0x00000002
    	#define MAPI_SENT               0x00000004
    
    	/* MAPISendMail() flags.    */
    
    	#define MAPI_LOGON_UI        0x00000001     //Display logon UI             
    	#define MAPI_NEW_SESSION     0x00000002    // Don't use shared session     
    
    	#ifndef MAPI_DIALOG				/* also defined in property.h */
    	#define MAPI_DIALOG             0x00000008  /* Display a send note UI       */
    	#endif
    	EXTERN_C IMAGE_DOS_HEADER __ImageBase;
    	/*
    	__declspec(dllexport) typedef ULONG (FAR PASCAL MAPISENDMAIL)(
    		LHANDLE lhSession,
    		ULONG_PTR ulUIParam,
    		lpMapiMessage lpMessage,
    		FLAGS flFlags,
    		ULONG ulReserved
    	);
    	__declspec(dllexport)  typedef MAPISENDMAIL FAR *LPMAPISENDMAIL;
    	MAPISENDMAIL MAPISendMail;
    
    	*/
    
    }		/*	extern "C" */
    
    #include "ZOxMailDLL.h"
    
    extern "C"  
    { 
    	__declspec(dllexport) ULONG MAPISendDocuments(ULONG ulUIParam, LPSTR lpszDelimChar, LPSTR lpszFilePaths, LPSTR lpszFileNames, ULONG ulReserved);
    	ULONG MAPISendDocuments(ULONG ulUIParam, LPSTR lpszDelimChar, LPSTR lpszFilePaths, LPSTR lpszFileNames, ULONG ulReserved)
    	{
    		MessageBox(NULL, TEXT("SendDocuments"), TEXT("test"), 0);
    		return 0;
    	}
    }
    
    extern "C"
    {
    
    	__declspec(dllexport) ULONG MAPISendMail(HANDLE lhSession, ULONG_PTR ulUIParam, lpMapiMessage fdwReason, FLAGS  asd ,ULONG ulReserved);
    	ULONG MAPISendMail(HANDLE lhSession, ULONG_PTR ulUIParam, lpMapiMessage fdwReason, FLAGS  asd ,ULONG ulReserved)
    	{	
    		MessageBox(NULL, TEXT("SendMail"), TEXT("Test"), 0);
    		return 1;
    	}
    }
    

    Ich hoffe es liegt an meinem Code und jemand kann mir helfen. Besten Dank für Eure Mühe.

    Gruss

    Manu



  • Die Mapi-Strukturen habe ich nicht genauer durchgesehen. Für das Senden scheinen die Mapi-Funktionen MapiLogon und MapiLogoff zu fehlen. Wo werden denn die in der DLL steckenden Mapi-Funktionen aufgerufen?
    Vorschläge:
    - Erst alles ohne DLL lauffähig machen.
    - Erst nur einzelne Mails versuchen, keine documents.
    Bitte bedenken: Browser mögen nicht besonders das Senden von Mails aus Programmen und können da giftig reagieren. Bei mir läuft das Senden mit SendMail unter Vista32 einwandfrei. Ob jeder Empfänger das ordentlich erhält weiss ich nicht. Der Browser oder Mailer auf der Empfangsseite kann vieles blockieren.



  • Ich hatte zum Testen alle MAPI funktionen in der DLL, aber um die Funktion von rechts klick auf eine Datei Senden An -> Email Empfänger braucht man nur die MAPISendMail und MAPISendDocuments Funktion (Die werden vom System aufgerufen).

    Ich will die grundlegende MAPI Funktion von Senden nicht verwenden, ich will Sie nur überschreiben um sie an meine eigene Funktion weiterzuleiten, um mit den nötigen Informationen zu arbeiten. Es dient also nur als Schnittstelle.

    Danke trotzdem für Deine schnelle Antwort.



  • Hallo,

    ich habe deinen Beispielcode ausprobiert, und festgestellt, dass er aus dem Adobe-Reader (das benötige ich 😃 ) zu 100% funktioniert, während er im Explorer nicht geht.
    Da der Adobe-Reader ein 32-Bit Programm ist und der Explorer ein 64-Bit vermute ich da ein 32-Bit / 64-Bit Problem, habe aber nicht weiter nachgeforscht. Der Thread ist ja auch schon ein wenig älter.

    Auf jeden Fall vielen Dank

    Flo


Log in to reply