PRB: Funciones BMAPI de MAPI Simple pueden no funcionar desde código de Visual Basic

Importante: este artículo contiene información acerca de cómo modificar el registro. Antes de modificar el registro, asegúrese de realizar una copia de seguridad y asegúrese de que sabe cómo restaurarlo si ocurre algún problema. Para obtener información acerca de cómo hacer copia de seguridad, restaurar y modificar el registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

Síntomas

Llamadas a la función MAPISendMail que se realizan desde código de Microsoft Visual Basic pueden producir un mensaje de error similar al siguiente:
Microsoft Outlook
No hay ningún cliente de correo predeterminado o el cliente de correo actual no puede satisfacer la solicitud de mensajería. Ejecute Microsoft Outlook y establézcalo como el cliente de correo predeterminado.
Este problema suele ocurre cuando Microsoft Outlook Express está configurado como cliente de correo predeterminado.

Causa

Programas de Visual Basic que emplean MAPI Simple normalmente utilizan instrucciones de Declare que importan las funciones BMAPI. Cuando Outlook Express es el cliente de correo predeterminado, la biblioteca de código auxiliar MAPI no puede enrutar estas llamadas a Outlook Express; en su lugar, producirá un error en las llamadas y se muestra un mensaje de error.

Solución

Una forma de resolver este problema es no utilizar instrucciones Declare que hacen referencia a las funciones BMAPI. Sin embargo, porque Visual Basic no puede llamar a funciones de la que no sean BMAPI (a menos que se manipulen las estructuras requeridas en el nivel binario), puede que desee escribir código para llamar a las funciones de MAPI Simple desde otro lenguaje que pueda tratar las estructuras, C o C++.

Se proporcionan dos soluciones al final de la sección "Más información".

Estado

Este comportamiento es por diseño.

Más información

La biblioteca de código auxiliar MAPI, Mapi32.dll, es la DLL que normalmente carga una aplicación cliente para utilizar MAPI Simple. La biblioteca de código auxiliar enruta las llamadas a la implementación de MAPI apropiada basándose en la configuración del registro. De esta forma, pueden coexistir varias implementaciones sin sobreescribirse entre sí.

Cuando se realiza una llamada a una función exportada por la biblioteca de código auxiliar, la biblioteca sigue estos pasos:
  1. Determina si la función es una función de MAPI Simple o una función de MAPI extendido. Las siguientes funciones de exportación están marcadas en la biblioteca de código auxiliar como funciones de MAPI Simple:

    • MAPIAddress
    • MAPIDeleteMail
    • MAPIDetails
    • MAPIFindNext
    • MAPIFreeBuffer
    • MAPILogoff
    • MAPILogon
    • MAPIReadMail
    • MAPIResolveName
    • MAPISaveMail
    • MAPISendDocuments
    • MAPISendMail

    Todas las demás funciones de exportación son funciones de MAPI extendido.
  2. Busca en la clave del registro siguiente para determinar la implementación MAPI predeterminada actual:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail::(Default)
  3. A continuación, busca en la clave del cliente para encontrar la ruta de acceso de la DLL correcta para cargar. Si la función es una función de MAPI Simple, carga la DLL especificada en el valor DllPath y, a continuación, llama a la función. Si la función es una función de MAPI extendido, carga la DLL especificada en el valor DllPathEx . Tras localizar la DLL apropiada, a continuación, llama a la función.

    En el caso de Microsoft Outlook, por ejemplo, busca el valor de DLLPath o DLLPathEx bajo la siguiente clave:
    Outlook HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft
  4. Si no se encuentra DllPathEx o DllPath , la biblioteca de código auxiliar utiliza el archivo Mapi32x.dll, que se encuentra en el mismo directorio que la biblioteca de código auxiliar. Este archivo suele ser una copia del archivo Mapi32.dll que ya existía cuando se instaló la biblioteca de código auxiliar ha cambiado el nombre. En muchos sistemas, especialmente aquellos donde se han instalado sólo en Outlook y Outlook Express, este archivo no existe.
  5. Si la biblioteca de código auxiliar no encuentra el archivo Mapi32x.dll, muestra el mensaje que se encuentra en una de las siguientes claves:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail::PreFirstRun


    - o -

    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail::NoMailClient
La razón del problema cuando se utiliza Outlook Express es el siguiente:
  1. La mayoría del código de Visual Basic utiliza instrucciones Declare basadas en el módulo Mapivb32.bas, que importa MAPISendMail como BMAPISendMail. La mayoría de las demás funciones de MAPI simple también se declara con sus equivalentes BMAPI. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

    163216 Mapivb32.bas actualizado de MAPI Simple en plataformas de 32 bits
  2. Como las funciones BMAPI no están en la lista de funciones de MAPI Simple que utilizan la DLL especificada en DllPath, la biblioteca de código auxiliar las enruta mediante el valor de DllPathEx.
  3. Dado que Outlook Express no implementa MAPI extendido, no tiene ningún valor establecido en DllPathEx.
  4. La biblioteca de código auxiliar intenta utilizar Mapi32x.dll, que no existe y como resultado muestra el mensaje PreFirstRun .
Existen otras dos formas de solucionar el problema:
  • Una solución temporal consiste en determinar si Outlook Express es el cliente de correo predeterminado y, si es así, agregue un valor DllPathEx al registro como sigue:
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Outlook Express::DllPathEx = %ProgramFiles%\Outlook Express\msoe.dll
    Advertencia: Si utiliza incorrectamente el Editor del registro puede provocar problemas graves que conlleven la reinstalación del sistema operativo. Microsoft no puede garantizar que pueda solucionar los problemas derivados del uso incorrecto del Editor del registro. Utilice el Editor del registro bajo su propio riesgo.

    Como Outlook Express implementa y exporta la BMAPI de Msoe.dll, establecer DllPathEx permite a la biblioteca de código auxiliar para dirigir las llamadas. El peligro de hacer esto es que un cliente que intente utilizar MAPI extendido recibirá un error (ya que Msoe.dll no exporta las funciones de MAPI extendido) cuando puede en su lugar haber utilizado correctamente Mapi32x.dll.
  • Para forzar una aplicación para utilizar la implementación de Outlook Express para todas las llamadas MAPI, cree un nuevo valor en la clave del registro siguiente:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\MSMapiApps
    Establezca el nombre del valor en el nombre de la aplicación (por ejemplo, MyApp.exe) y, a continuación, establezca el valor en Outlook Express. Esto omite la biblioteca de código auxiliar y obliga a pasar todas las llamadas MAPI, incluidas las llamadas BMAPI, directamente a Outlook Express.
Propiedades

Id. de artículo: 315458 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios