REVISIÓN: Infracción de acceso en MSDAER.DLL con _com_error excepciones

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.

173645
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Síntomas
Se cuando se utiliza la característica de # import del compilador, ADO, el proveedor de ODBC OLE DB 1.1 y reventado _com_error excepciones, acceso produce una infracción en MSDAER.DLL al cerrar una aplicación.
Causa
Creado con # import un método puede producir una excepción _com_error. Cuando se produce la excepción, Release() no se llama en el puntero de IErrorInfo que se devuelve desde GetErrorInfo(). Esto deja el objeto de error interno en el proveedor OLEDB de ODBC no válidos que hace que la infracción de acceso se producen cuando la aplicación se cierra.
Solución
Cree una macro que puede utilizarse para Release() interfaz IErrorInfo al final del bloque "catch". Por ejemplo:
   #define BUGFIX_RELEASE_IERRORINFO(error) \            IErrorInfo * pErr = error.ErrorInfo();  \            pErr->Release();                        \            pErr->Release();				
aquí es un ejemplo de cómo podría utilizar:
   try   {     //.... call a #import generated method     if ( m_connection == NULL )   {      if(S_OK == m_connection.CreateInstance("ADODB.Connection.1", NULL,   CLSCTX_INPROC_SERVER))         m_connection->Open(varDataSource, varUserId, varPwd);      }   }   catch(_com_error & err)   {     // Error handling code...     ::MessageBox(NULL, (LPCSTR)err.Description(), _T("ADO Error"), MB_OK);     BUGFIX_RELEASE_IERRORINFO(err);   }				
Estado
Microsoft ha confirmado que se trata de un error de los productos Microsoft enumerados al principio de este artículo. Este error se ha corregido en Service Pack 3 de Visual Studio 97 y Visual C++ versión 6.0.

Si desea más información, consulte el siguiente artículo de Microsoft Knowledge Base:
170365INFORMACIÓN: 97 Service Pack de Visual Studio-, dónde están y por qué
excepción no controlada AV

Advertencia: este artículo se ha traducido automáticamente

Propiedades

Id. de artículo: 173645 - Última revisión: 01/24/2014 11:08:41 - Revisión: 1.0

  • Microsoft Visual C++ 5.0 Enterprise Edition
  • kbnosurvey kbarchive kbmt kbbug kbfix kbvc600fix kbvs97sp2fix KB173645 KbMtes
Comentarios