Поделиться через


Глобальные функции для отладки и создания отчетов об ошибках

Эти функции обеспечивают полезные средства отладки и трассировки.

Имя Описание
AtlHresultFromLastError GetLastError Возвращает код ошибки в виде HRESULT.
AtlHresultFromWin32 Преобразует код ошибки Win32 в HRESULT.
AtlReportError IErrorInfo Настраивается для предоставления сведений об ошибке клиенту.
AtlThrow Формирует исключение CAtlException.
AtlThrowLastWin32 Вызывайте эту функцию для сообщения об ошибке на основе результата функции Windows GetLastError.

AtlHresultFromLastError

Возвращает значение кода последней ошибки в вызывающем потоке в форме HRESULT.

HRESULT AtlHresultFromLastError();

Замечания

AtlHresultFromLastError вызывается GetLastError для получения последней ошибки и возвращает ошибку после преобразования его в HRESULT с помощью макроса HRESULT_FROM_WIN32.

Требования

Заголовок: atlcomcli.h

AtlHresultFromWin32

Преобразует код ошибки Win32 в HRESULT.

AtlHresultFromWin32(DWORD error);

Параметры

error
Значение ошибки для преобразования.

Замечания

Преобразует код ошибки Win32 в HRESULT с помощью макроса HRESULT_FROM_WIN32.

Примечание.

Вместо использования HRESULT_FROM_WIN32(GetLastError())используйте функцию AtlHresultFromLastError.

Требования

Заголовок: atlcomcli.h

AtlReportError

Настраивает интерфейс для предоставления сведений об ошибке IErrorInfo клиентам объекта.

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());

Параметры

Clsid
[in] CLSID объекта, сообщающего об ошибке.

lpszDesc
[in] Строка, описывающая ошибку. Версии Юникода указывают, что lpszDesc имеет тип LPCOLESTR; версия ANSI указывает тип LPCSTR.

Iid
[in] IiD интерфейса, определяющего ошибку или GUID_NULL, если ошибка определена операционной системой.

hRes
[in] HRESULT, который вы хотите вернуть вызывающему объекту.

Nid
[in] Идентификатор ресурса, в котором хранится строка описания ошибки. Это значение должно лежать между 0x0200 и 0xFFFF включительно. В отладочных сборках утверждение приведет к тому, что nID не индексирует допустимую строку. В сборках выпуска строка описания ошибки будет иметь значение "Неизвестная ошибка".

dwHelpID
[in] Идентификатор контекста справки для ошибки.

lpszHelpFile
[in] Путь и имя файла справки, описывающего ошибку.

hInst
[in] Дескриптор ресурса. По умолчанию этот параметр является __AtlBaseModuleModule::GetResourceInstance__AtlBaseModuleModule глобальным экземпляром CAtlBaseModule или классом, производным от него.

Возвращаемое значение

Если параметр hRes не является ненулевой, возвращает значение hRes. Если hRes равно нулю, первые четыре версии возвращаемого AtlReportError DISP_E_EXCEPTION. Последние две версии возвращают результат макроса MAKE_HRESULT(1, FACILITY_ITF;nID).

Замечания

Строка lpszDesc используется в качестве текстового описания ошибки. Когда клиент получает возвращаемые данные hResAtlReportError, клиент может получить доступ к IErrorInfo структуре для получения сведений об ошибке.

Пример

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");
}

Внимание

Не используйте AtlReportError в обработчиках перехвата C++. Некоторые переопределения этих функций используют макросы преобразования строк ATL внутри системы, которые, в свою очередь, используют _alloca функцию внутри. Использование AtlReportError обработчика перехвата C++ может вызвать исключения в обработчиках перехвата C++.

Требования

Заголовок: atlcom.h

AtlThrow

Вызовите эту функцию, чтобы сообщить об ошибке на основе кода состояния HRESULT.

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

Параметры

Hr
Стандартное значение HRESULT.

Замечания

Эта функция используется кодом ATL и MFC в случае возникновения ошибки. Его также можно вызвать из собственного кода. Реализация этой функции по умолчанию зависит от определения символа _ATL_NO_EXCEPTIONS и типа проекта, MFC или ATL.

Во всех случаях эта функция трассирует HRESULT до отладчика.

В Visual Studio 2015 с обновлением 3 и более поздних версий эта функция относится к __declspec(noreturn), чтобы избежать спрогнозных предупреждений SAL.

Если _ATL_NO_EXCEPTIONS не определен в проекте MFC, эта функция создает исключение CMemoryException или COleException на основе значения HRESULT.

Если _ATL_NO_EXCEPTIONS не определен в проекте ATL, функция создает исключение CAtlException.

Если определена _ATL_NO_EXCEPTIONS, функция вызывает сбой утверждения вместо того, чтобы вызвать исключение.

Для проектов ATL можно предоставить собственную реализацию этой функции, которая будет использоваться ATL в случае сбоя. Для этого определите собственную функцию с той же подписью, что AtlThrow и #define AtlThrow имя функции. Это необходимо сделать перед включением atlexcept.h (это означает, что это необходимо сделать до включения заголовков ATL, так как atlbase.h включает atlexcept.h). Атрибут функции __declspec(noreturn) , чтобы избежать спрогнозных предупреждений SAL.

Пример

// 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 ..
};

Требования

Заголовок: atldef.h

AtlThrowLastWin32

Вызывайте эту функцию для сообщения об ошибке на основе результата функции Windows GetLastError.

inline void AtlThrowLastWin32();

Замечания

Эта функция отслеживает результат GetLastError отладчика.

Если _ATL_NO_EXCEPTIONS не определен в проекте MFC, эта функция создает исключение CMemoryException или COleException на основе возвращаемого GetLastErrorзначения.

Если _ATL_NO_EXCEPTIONS не определен в проекте ATL, функция создает исключение CAtlException.

Если определена _ATL_NO_EXCEPTIONS, функция вызывает сбой утверждения вместо того, чтобы вызвать исключение.

Требования

Заголовок: atldef.h

См. также

Функции
Макросы для отладки и создания отчетов об ошибках