Funciones globales de depuración e informe de errores

Estas funciones proporcionan facilidades útiles de depuración y seguimiento.

Nombre Descripción
AtlHresultFromLastError Devuelve a GetLastError el código de error en formato HRESULT.
AtlHresultFromWin32 Convierte un código de error Win32 en un valor HRESULT.
AtlReportError Configura IErrorInfo para proporcionar detalles de errores a un cliente.
AtlThrow Genera una CAtlException.
AtlThrowLastWin32 Llame a esta función para notificar un error en función del resultado de la función de Windows GetLastError.

AtlHresultFromLastError

Devuelve el último valor de código de error del subproceso que realiza la llamada con el formato HRESULT.

HRESULT AtlHresultFromLastError();

Comentarios

AtlHresultFromLastError llama a GetLastError para obtener el último error y lo devuelve después de convertirlo en HRESULT mediante la macro HRESULT_FROM_WIN32.

Requisitos

Encabezado: atlcomcli.h

AtlHresultFromWin32

Convierte un código de error Win32 en un valor HRESULT.

AtlHresultFromWin32(DWORD error);

Parámetros

error
El valor de error que se va a convertir.

Comentarios

Convierte un código de error Win32 en un HRESULT, al usar la macro HRESULT_FROM_WIN32.

Nota:

En lugar de usar HRESULT_FROM_WIN32(GetLastError()), use la función AtlHresultFromLastError.

Requisitos

Encabezado: atlcomcli.h

AtlReportError

Configura la interfaz IErrorInfo para proporcionar información de error a los clientes del objeto.

HRESULT WINAPI AtlReportError(
    const CLSID& clsid,
    LPCOLESTR lpszDesc,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

HRESULT WINAPI AtlReportError(
    const CLSID& clsid,
    LPCOLESTR lpszDesc,
    DWORD dwHelpID,
    LPCOLESTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

HRESULT WINAPI AtlReportError(
    const CLSID& clsid,
    LPCSTR lpszDesc,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

HRESULT WINAPI AtlReportError(
    const CLSID& clsid,
    LPCSTR lpszDesc,
    DWORD dwHelpID,
    LPCSTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

HRESULT WINAPI AtlReportError(
    const CLSID& clsid,
    UINT nID,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0,
    HINSTANCE hInst = _AtlBaseModule.GetResourceInstance());

HRESULT WINAPI AtlReportError(
    const CLSID& clsid,
    UINT nID,
    DWORD dwHelpID,
    LPCOLESTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0,
    HINSTANCE hInst = _AtlBaseModule.GetResourceInstance());

Parámetros

clsid
[in] El CLSID del objeto que notifica el error.

lpszDesc
[in] La cadena que describe el error. Las versiones Unicode especifican que lpszDesc es de tipo LPCOLESTR; la versión ANSI que especifica un tipo de LPCSTR.

iid
[in] El IID de la interfaz que define el error o GUID_NULL si el sistema operativo define el error.

hRes
[in] El parámetro HRESULT que quiere devolver al autor de llamada.

Nid
[in] El identificador de recurso donde se almacena la cadena de descripción del error. Este valor debe estar entre 0x0200 y 0xFFFF, ambos inclusive. En las compilaciones de depuración, un valor ASSERT será el resultado si nID no indexa una cadena válida. En las compilaciones de lanzamiento, la cadena de descripción del error se definirá como "Error desconocido".

dwHelpID
[in] El identificador de contexto de ayuda para el error.

lpszHelpFile
[in] La ruta de acceso y el nombre del archivo de ayuda que describe el error.

hInst
[in] El identificador del recurso. De forma predeterminada, este parámetro es __AtlBaseModuleModule::GetResourceInstance, en el que __AtlBaseModuleModule es la instancia global de CAtlBaseModule o una clase derivada del mismo.

Valor devuelto

Si el parámetro hRes no es cero, devuelve el valor de hRes. Si hRes es cero, las cuatro primeras versiones de AtlReportError devuelven DISP_E_EXCEPTION. Las dos últimas versiones devuelven el resultado de la macro MAKE_HRESULT( 1, FACILITY_ITF,nID).

Comentarios

La cadena lpszDesc se usa como descripción de texto del error. Cuando el cliente recibe hRes devuelto desde AtlReportError, el cliente puede acceder a la estructura IErrorInfo para obtener más información sobre el error.

Ejemplo

STDMETHODIMP CMyControl::MyErrorProneMethod()
{
   BOOL bSucceeded = ErrorProneFunc();
   if (bSucceeded)
      return S_OK;
   else
      // hRes is set to DISP_E_EXCEPTION
      return AtlReportError(GetObjectCLSID(), L"My error message");
}

Precaución

No use AtlReportError en los controladores catch de C++. Algunas invalidaciones de estas funciones usan internamente las macros de conversión de cadenas ATL, que a su vez usan la función_alloca internamente. El uso de AtlReportError en un controlador catch de C++ puede provocar excepciones en dichos controladores.

Requisitos

Encabezado: atlcom.h

AtlThrow

Llame a esta función para notificar un error basado en un código de estado HRESULT.

__declspec(noreturn) inline void AtlThrow(HRESULT hr);

Parámetros

Hr
Valor HRESULT estándar.

Comentarios

El código ATL y MFC usan esta función cuando se da una condición de error. También se puede llamar desde el mismo código. La implementación predeterminada de esta función depende de la definición del símbolo _ATL_NO_EXCEPTIONS y del tipo de proyecto, de MFC o de ATL.

En todos los casos, esta función realiza un seguimiento del HRESULT al depurador.

En la actualización 3 de Visual Studio 2015 y versiones posteriores, esta función se atribuye a __declspec(noreturn) para evitar advertencias falsas de SAL.

Si _ATL_NO_EXCEPTIONS no está definido en un proyecto de MFC, esta función inicia una CMemoryException o una COleException basada en el valor de HRESULT.

Si _ATL_NO_EXCEPTIONS no está definido en un proyecto ATL, la función inicia una CAtlException.

Si se define _ATL_NO_EXCEPTIONS, la función produce un error de aserción en lugar de iniciar una excepción.

Para los proyectos de ATL, es posible proporcionar la propia implementación de esta función para que la use ATL en caso de error. Para ello, defina su propia función con la misma firma que AtlThrow y #define AtlThrow para que sea el nombre de la función. Esto debe hacerse antes de incluir atlexcept.h (lo que significa que debe hacerse antes de incluir los encabezados de ATL, ya que atlbase.h incluye atlexcept.h). Atribuye la función __declspec(noreturn) para evitar advertencias falsas de SAL.

Ejemplo

// Constructors and operators cannot return error codes, and
// so they are the place where exceptions are generally used.
class CMyClass
{
private:
   CComPtr<IBuddy> m_spBuddy;
public:
   CMyClass()
   {
      HRESULT hr = m_spBuddy.CoCreateInstance(CLSID_Buddy);
      if (FAILED(hr))
         AtlThrow(hr);
   }
   //   methods ..
};

Requisitos

Encabezado: atldef.h

AtlThrowLastWin32

Llame a esta función para notificar un error en función del resultado de la función de Windows GetLastError.

inline void AtlThrowLastWin32();

Comentarios

Esta función hace un seguimiento del resultado de GetLastError en el depurador.

Si _ATL_NO_EXCEPTIONS no está definido en un proyecto de MFC, esta función inicia una CMemoryException o COleException basada en el valor devuelto por GetLastError.

Si _ATL_NO_EXCEPTIONS no está definido en un proyecto ATL, la función inicia una CAtlException.

Si se define _ATL_NO_EXCEPTIONS, la función produce un error de aserción en lugar de iniciar una excepción.

Requisitos

Encabezado: atldef.h

Consulte también

Funciones
Macros de depuración e informe de errores