Cómo reemplazar la excepción de # import provocar el mecanismo de ActiveX Data Objects (ADO) en Visual C++

Seleccione idioma Seleccione idioma
Id. de artículo: 177425 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Nota Microsoft Visual C++ .NET 2002 y Visual C++ .NET 2003 admiten el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.Visual C++ .NET 2005 admite el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows.
Expandir todo | Contraer todo

En esta página

Resumen

Mediante la instrucción # import para crear la aplicación cliente presenta el control de excepciones a través de la clase de excepción _com_error a un contenedor para un método del objeto encuentra un error HRESULT. Puede que tenga razones válidas para reemplazar este mecanismo con su propia implementación.

Más información

Hay dos formas de utilizar # import y que no generan excepciones de errores HRESULTS. La primera es utilizar la cláusula raw_interfaces_only con la instrucción # import. Sin embargo, esto niega algunas de las ventajas de las clases contenedoras que ofrece de # import.

La segunda técnica es proporcionar su propia implementación para _com_raise_error, que tiene la implementación predeterminada y el prototipo siguiente:

   void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0)
   throw(_com_error);

   void __stdcall
   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0) throw(_com_error)
   {
       throw _com_error(hr, perrinfo);
   }
				
Esta función es declarada pero no implementada en el archivo Comdef.h. Si proporciona su propia implementación en un archivo .obj, el vinculador utiliza esa implementación en oposición a poner desde el archivo comsupp.lib. _com_raise_error existe en su propio objeto en el archivo comsupp.lib por lo que se puede reemplazar fácilmente por el código.

Siguiente es una implementación ejemplo de excepción del # Import provocar la función.

Nota : actualmente el compilador omite una especificación de excepción de función y genera la advertencia siguiente:

Advertencia C4290: especificación de excepciones de C++ pasa por alto.
En este momento, los detalles de implementación de la especificación de excepción han no se ha estandarizado y se aceptan pero no implementan en Microsoft Visual C++. Código compilado con las especificaciones de excepción omitidas que necesite se vuelve a compilar y vinculada a utilizarse en futuras versiones compatibles con las especificaciones de excepción. Puede evitar esta advertencia utilizando la directiva pragma warning:

#pragma warning( disable : 4290 ) 
				

Código de ejemplo

   void __stdcall
   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0) throw(_com_error)
       {
           //This message box is for demonstration purpose only.
           AfxMessageBox( "_com_raise_error (HRESULT, IErrorInfo*)" );
           //Your own error handling code or just an abort.
       }

    #import <msado15.dll>
        ...


     _bstr_t     bstrEmpty(L"");
     _ConnectionPtr  Conn1 = NULL;
     Conn1.CreateInstance( __uuidof( Connection ) );
     Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty );

				
Este código intenta abrir un objeto de conexión de ActiveX Data Objects (ADO) sin proporcionar ninguna información de conexión válida. Reemplazar _com_raise_error impidió que se provoque el _com_error.

Propiedades

Id. de artículo: 177425 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft Visual C++ .NET 2002 Standard
Palabras clave: 
kbnosurvey kbarchive kbmt kbhowto kbcompiler kbdatabase kbinfo kbmdacnosweep KB177425 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 177425

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com