Globální funkce ladění a hlášení chyb
Tyto funkce poskytují užitečné možnosti ladění a trasování.
Název | Popis |
---|---|
AtlHresultFromLastError | GetLastError Vrátí kód chyby ve formě HRESULT. |
AtlHresultFromWin32 | Převede kód chyby Win32 na HRESULT. |
AtlReportError | Nastaví pro IErrorInfo klienta podrobnosti o chybě. |
AtlThrow | Vyhodí .CAtlException |
AtlThrowLastWin32 | Voláním této funkce signalizují chybu na základě výsledku funkce GetLastError Systému Windows . |
AtlHresultFromLastError
Vrátí hodnotu posledního kódu chyby volajícího vlákna ve formě HRESULT.
HRESULT AtlHresultFromLastError();
Poznámky
AtlHresultFromLastError
volání GetLastError
k získání poslední chyby a vrátí chybu po převodu na HRESULT pomocí HRESULT_FROM_WIN32 makra.
Požadavky
Hlavička: atlcomcli.h
AtlHresultFromWin32
Převede kód chyby Win32 na HRESULT.
AtlHresultFromWin32(DWORD error);
Parametry
chyba
Chybová hodnota, kterou chcete převést.
Poznámky
Převede kód chyby Win32 na HRESULT pomocí HRESULT_FROM_WIN32 makra.
Poznámka:
Místo použití HRESULT_FROM_WIN32(GetLastError())
použijte funkci AtlHresultFromLastError.
Požadavky
Hlavička: atlcomcli.h
AtlReportError
Nastaví rozhraní tak IErrorInfo
, aby klientům objektu poskytovalo informace o chybách.
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());
Parametry
clsid
[v] CLSID objektu, který hlásí chybu.
lpszDesc
[v] Řetězec popisující chybu. Verze Unicode určují, že lpszDesc je typu LPCOLESTR; verze ANSI určuje typ LPCSTR.
iid
[v] IID rozhraní definující chybu nebo GUID_NULL, pokud je chyba definována operačním systémem.
hRes
[v] Hodnota HRESULT, kterou chcete vrátit volajícímu.
Nid
[v] Identifikátor prostředku, kde je uložen řetězec popisu chyby. Tato hodnota by měla být mezi 0x0200 a 0xFFFF(včetně). V buildech ladění bude výsledkem ASSERT, pokud nID neindexuje platný řetězec. V buildech vydaných verzí se řetězec popisu chyby nastaví na Neznámá chyba.
dwHelpID
[v] Identifikátor kontextu nápovědy pro chybu.
lpszHelpFile
[v] Cesta a název souboru nápovědy popisující chybu
hInst
[v] Popisovač prostředku. Ve výchozím nastavení je tento parametr , kde __AtlBaseModuleModule
je __AtlBaseModuleModule::GetResourceInstance
globální instance CAtlBaseModule nebo třídy odvozené z ní.
Návratová hodnota
Pokud je parametr hRes nenulová, vrátí hodnotu hRes. Pokud je hodnota hRes nula, pak první čtyři verze návratových AtlReportError
DISP_E_EXCEPTION. Poslední dvě verze vrátí výsledek makra MAKE_HRESULT( 1, FACILITY_ITF; nID
).
Poznámky
Řetězec lpszDesc se používá jako textový popis chyby. Když klient obdrží hodnotu hRes , ze AtlReportError
které se vrátíte, má klient přístup ke IErrorInfo
struktuře s podrobnostmi o chybě.
Příklad
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");
}
Upozornění
Nepoužívejte AtlReportError
v obslužných rutinách zachycení jazyka C++. Některá přepsání těchto funkcí používají interně makra převodu řetězců ATL, která _alloca
funkci používají interně. Použití AtlReportError
v obslužné rutině zachycení jazyka C++ může způsobit výjimky v obslužných rutinách zachycení jazyka C++.
Požadavky
Hlavička: atlcom.h
AtlThrow
Voláním této funkce signalizujete chybu na základě stavového kódu HRESULT.
__declspec(noreturn) inline void AtlThrow(HRESULT hr);
Parametry
Hr
Standardní hodnota HRESULT.
Poznámky
Tuto funkci používá kód KNIHOVNY ATL a MFC v případě chybového stavu. Můžete ho také volat z vlastního kódu. Výchozí implementace této funkce závisí na definici symbolu _ATL_NO_EXCEPTIONS a na typu projektu, MFC nebo ATL.
Ve všech případech tato funkce trasuje HRESULT ladicímu programu.
V sadě Visual Studio 2015 Update 3 a novější je tato funkce přiřazena __declspec(noreturn), aby se zabránilo nechutným upozorněním SAL.
Pokud _ATL_NO_EXCEPTIONS není definován v projektu MFC, tato funkce vyvolá výjimku CMemoryException nebo COleException na základě hodnoty HRESULT.
Pokud _ATL_NO_EXCEPTIONS není definován v projektu ATL, funkce vyvolá výjimku CAtlException.
Pokud je definována _ATL_NO_EXCEPTIONS, funkce místo vyvolání výjimky způsobí selhání kontrolního výrazu.
V případě projektů ATL je možné poskytnout vlastní implementaci této funkce, kterou atL použije v případě selhání. Uděláte to tak, že definujete vlastní funkci se stejným podpisem jako AtlThrow
a #define AtlThrow
jako název funkce. To musí být provedeno před zahrnutím atlexcept.h (což znamená, že musí být provedeno před zahrnutím všech hlaviček ATL, protože atlbase.h obsahuje atlexcept.h). Přiřaďte funkci __declspec(noreturn)
, abyste se vyhnuli nechtěným upozorněním SAL.
Příklad
// 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 ..
};
Požadavky
Hlavička: atldef.h
AtlThrowLastWin32
Voláním této funkce signalizují chybu na základě výsledku funkce GetLastError
Systému Windows .
inline void AtlThrowLastWin32();
Poznámky
Tato funkce sleduje výsledek GetLastError
ladicího programu.
Pokud _ATL_NO_EXCEPTIONS není definován v projektu MFC, tato funkce vyvolá CMemoryException nebo COleException na základě hodnoty vrácené GetLastError
.
Pokud _ATL_NO_EXCEPTIONS není definován v projektu ATL, funkce vyvolá výjimku CAtlException.
Pokud je definována _ATL_NO_EXCEPTIONS, funkce místo vyvolání výjimky způsobí selhání kontrolního výrazu.
Požadavky
Hlavička: atldef.h