Come creare uno stub MAPI32.dll per essere in grado di “inviare come allegato” da MS Word?

StackOverflow https://stackoverflow.com/questions/1458690

Domanda

Microsoft Word è "invia come allegato" funzionalità che crea un nuovo messaggio in Outlook con il documento allegato.

Vorrei sostituire Outlook con un agente di posta elettronica personalizzato, ma non so come raggiungere questo obiettivo. Ora il mio agente di posta è semplicemente un programma che gira, e prende il nome del file come parametro.

Per quanto ne so, "invia come allegato" sta usando alcune DLL / API chiamata MAPI. Avrei bisogno di cambiare la mia app in modo che non si limita a accetta argomenti nomi di file, ma riesco a ricevere MAPI (?) Chiama MS Word utilizza quando "l'invio come allegato".

Inoltre, ho bisogno di cambiare l'agente di posta elettronica predefinito per creare il mio stub MAPI32.dll che reindirizza semplicemente alla mia app.

Mi piacerebbe apprezzare se qualcuno avesse maggiori informazioni su come questo potrebbe essere realizzato!

È stato utile?

Soluzione

Quando si scrive la propria implementazione di MAPI è fondamentale per creare una DLL con entrambe le esportazioni corrette e convenzioni di chiamata in ordine per il sistema DLL stub MAPI (c: \ windows \ system32 \ mapi32.dll, dovrebbe essere lo stesso di MAPIStub .dll) per passare le chiamate attraverso la DLL. funzioni MAPI vengono chiamate con la convenzione di chiamata __stdcall. Inoltre critica sta definendo le chiavi di registro giusto per poter MAPI DLL di essere scelto dal stub sistema, sembra che hai già trovato quello giusto, al fine di specificare un particolare MAPI dll essere utilizzato quando l'applicaion effettua chiamate MAPI.

ho fatto questa cosa esatta da poco: ha scritto la mia dll scheletro MAPI, e aveva un sacco di problemi a trovare lo stub sistema per chiamare le mie funzioni MAPI estese. La chiave è stata che mapi32.dll chiama GetProcAddress sul punto di ingresso "foo @ x", non l'entrypoint "pippo" nell'interfaccia MAPI al fine di verificare se la DLL è "compatibile" con MAPI estesa (credo che per semplice MAPI chiama non usa il "foo @ x", ma la pianura "foo" nome entrypoint). Ho anche avuto a compilare il mio file di interfaccia della libreria scheletro nel mio progetto "Come C" e non "come C ++" al fine di ottenere tutti i nomi dei simboli giusti.

Per esempio, MAPIInitialize dovrebbe essere dichiarato come questo nel codice sorgente:

HRESULT __stdcall MAPIInitialize( LPVOID lpMapiInit )
...

ed è necessario specificare un file .def con le voci in questo modo:

EXPORTS
    MAPIInitialize@4=_MAPIInitialize@4
    MAPIInitialize=_MAPIInitialize@4

Per le chiamate Simple MAPI (al contrario di chiamate MAPI estesa), potrebbe non essere necessario il "doppio esportazione". Per vedere quali sono le esportazioni sembrano per un'implementazione MAPI di lavoro, si può fare questo (se si dispone di Outlook installato sul vostro sistema):

c:\> dumpbin /exports c:\Program Files\Common Files\SYSTEM\MSMAPI\1033\msmapi32.dll

(o sostituire il percorso si trova nel Registro di sistema in HKLM\Software\Clients\Mail\Microsoft Outlook\DLLPathEx)

Altri suggerimenti

OK, per rispondere alla mia domanda. Ho bisogno di costruire una DLL con "MAPISendDocuments" e / o funzioni "MAPISendMail" definiti.

Questa DLL può avere qualsiasi nome, ed è fatto riferimento nel Registro di sistema in HKLM / Software / clienti / Mail / MyMailApp / DLLPath.

esempi trovati con Delphi ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top