Глобальные функции для отладки и создания отчетов об ошибках
Эти функции обеспечивают полезные средства отладки и трассировки.
Имя | Описание |
---|---|
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);
Параметры
час
Стандартное значение 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