Cómo crear un talón MAPI32.dll ser capaz de “enviar como archivo adjunto” de MS Word?

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

Pregunta

Microsoft Word ha "enviar como archivo adjunto" funcionalidad que crea un nuevo mensaje de Outlook con el documento adjunto.

Me gustaría sustituir a Outlook con un agente de correo personalizado, pero no sé cómo lograr esto. Ahora mi agente de correo es simplemente un programa que se ejecuta y realiza un nombre de archivo como parámetro.

Por lo que yo sé, "enviar como archivo adjunto" está usando alguna DLL / API llamada MAPI. Yo tendría que cambiar de aplicación para que no se limita a aceptar los argumentos de nombre de archivo, pero puede recibir MAPI (?) Llama MS Word utiliza cuando "enviar como archivo adjunto".

Además, tengo que cambiar el agente de correo predeterminado mediante la creación de mi propio trozo MAPI32.dll que simplemente se vuelve a dirigir a mi aplicación.

Te agradecería si alguien tenía más información sobre cómo esto podría lograrse!

¿Fue útil?

Solución

Al escribir su propia implementación de MAPI es fundamental para crear un archivo DLL con ambas las exportaciones adecuadas y convenciones de llamada con el fin de la DLL talón de sistema MAPI (c: \ windows \ system32 \ mapi32.dll, deben ser los mismos que mapistub .dll) para pasar las llamadas a través de su DLL. funciones de MAPI se denominan con la convención de llamada __stdcall. También es fundamental es establecer las claves de registro adecuados con el fin de que MAPI DLL para ser elegido por el talón sistema, parece que ya has encontrado el más adecuado con el fin de especificar un determinado MAPI dll ser utilizado cuando su applicaion hace llamadas MAPI.

Me hizo esto exactamente lo hace poco: escribió mi propia DLL MAPI esqueleto, y tenía un montón de problemas para conseguir el talón sistema para llamar a mis funciones MAPI extendidos. La clave fue que mapi32.dll llama a GetProcAddress en el punto de entrada "foo @ x", no es el punto de entrada "foo" en la interfaz MAPI con el fin de probar si o no el archivo DLL es "compatible" con MAPI extendido (creo que por simples llamadas MAPI que no utiliza el "foo @ x", pero la llanura "foo" nombre de punto de entrada). También tuve que compilar mi archivo de interfaz de biblioteca esqueleto en mi proyecto "Como C" y no "como C ++" con el fin de obtener todos los nombres de los símbolos correctos.

Por ejemplo, MAPIInitialize debe ser declarada como esto en su código fuente:

HRESULT __stdcall MAPIInitialize( LPVOID lpMapiInit )
...

y tendrá que especificar un archivo .def con entradas como esta:

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

Para las llamadas MAPI simple (en contraposición a las llamadas MAPI extendida), puede que no necesite el "doble de exportación". Con el fin de ver lo que las exportaciones se ven como una aplicación de MAPI de trabajo, se puede hacer esto (si tiene Outlook instalado en su sistema):

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

(o sustituya la ruta que se encuentra en el Registro en HKLM\Software\Clients\Mail\Microsoft Outlook\DLLPathEx)

Otros consejos

Aceptar, para responder a mi propia pregunta. Necesito construir una DLL con "MAPISendDocuments" y / o "funciones" MAPISendMail definidos.

Esta DLL puede tener cualquier nombre, y se hace referencia en el registro en HKLM / Software / Clientes / Correo / MyMailApp / DLLPath.

ejemplos encontrados usando Delphi ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top