Funkcje globalne debugowania i raportowania błędów
Te funkcje zapewniają przydatne funkcje debugowania i śledzenia.
Nazwa/nazwisko | opis |
---|---|
AtlHresultFromLastError | Zwraca kod błędu GetLastError w postaci HRESULT. |
AtlHresultFromWin32 | Konwertuje kod błędu Win32 na HRESULT. |
AtlReportError | Konfiguruje w IErrorInfo celu podania szczegółów błędu klientowi. |
AtlThrow | Zgłasza element CAtlException . |
AtlThrowLastWin32 | Wywołaj tę funkcję, aby zasygnalizować błąd na podstawie wyniku funkcji GetLastError systemu Windows . |
AtlHresultFromLastError
Zwraca wartość kodu ostatniego błędu wywołującego wątku w formie HRESULT.
HRESULT AtlHresultFromLastError();
Uwagi
AtlHresultFromLastError
wywołuje GetLastError
metodę w celu uzyskania ostatniego błędu i zwraca błąd po przekonwertowaniu go na wartość HRESULT przy użyciu makra HRESULT_FROM_WIN32.
Wymagania
Nagłówek: atlcomcli.h
AtlHresultFromWin32
Konwertuje kod błędu Win32 na HRESULT.
AtlHresultFromWin32(DWORD error);
Parametry
błąd
Wartość błędu do konwersji.
Uwagi
Konwertuje kod błędu Win32 na HRESULT przy użyciu HRESULT_FROM_WIN32 makra.
Uwaga
Zamiast używać HRESULT_FROM_WIN32(GetLastError())
polecenia , użyj funkcji AtlHresultFromLastError.
Wymagania
Nagłówek: atlcomcli.h
AtlReportError
IErrorInfo
Konfiguruje interfejs w celu dostarczenia informacji o błędzie klientom obiektu.
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
[in] Identyfikator CLSID obiektu zgłasza błąd.
lpszDesc
[in] Ciąg opisujący błąd. Wersje Unicode określają, że lpszDesc jest typu LPCOLESTR; wersja ANSI określa typ LPCSTR.
identyfikator iid
[in] Identyfikator IID interfejsu definiujący błąd lub GUID_NULL, jeśli błąd jest zdefiniowany przez system operacyjny.
hRes
[in] HrESULT, który ma zostać zwrócony do wywołującego.
Nid
[in] Identyfikator zasobu, w którym jest przechowywany ciąg opisu błędu. Ta wartość powinna znajdować się między 0x0200 a 0xFFFF włącznie. W kompilacjach debugowania funkcja ASSERT będzie skutkować tym, że identyfikator nID nie indeksuje prawidłowego ciągu. W kompilacjach wydania ciąg opisu błędu zostanie ustawiony na "Nieznany błąd".
dwHelpID
[in] Identyfikator kontekstu pomocy dla błędu.
lpszHelpFile
[in] Ścieżka i nazwa pliku pomocy opisującego błąd.
hInst
[in] Dojście do zasobu. Domyślnie ten parametr to __AtlBaseModuleModule::GetResourceInstance
, gdzie __AtlBaseModuleModule
jest globalnym wystąpieniem klasy CAtlBaseModule lub klasy pochodnej.
Wartość zwracana
Jeśli parametr hRes jest niezerowy, zwraca wartość hRes. Jeśli wartość hRes wynosi zero, wówczas pierwsze cztery wersje zwracanych AtlReportError
DISP_E_EXCEPTION. Ostatnie dwie wersje zwracają wynik makra MAKE_HRESULT( 1, FACILITY_ITF, nID
).
Uwagi
Ciąg lpszDesc jest używany jako opis tekstu błędu. Gdy klient odbiera elementy hRes zwracane z AtlReportError
programu , klient może uzyskać dostęp do IErrorInfo
struktury, aby uzyskać szczegółowe informacje o błędzie.
Przykład
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");
}
Uwaga
Nie należy używać AtlReportError
w programach obsługi catch języka C++. Niektóre przesłonięcia tych funkcji używają makr konwersji ciągów ATL wewnętrznie, które z kolei używają _alloca
funkcji wewnętrznie. Użycie w AtlReportError
procedurze obsługi catch języka C++ może powodować wyjątki w programach obsługi catch języka C++.
Wymagania
Nagłówek: atlcom.h
AtlThrow
Wywołaj tę funkcję, aby zasygnalizować błąd na podstawie kodu stanu HRESULT.
__declspec(noreturn) inline void AtlThrow(HRESULT hr);
Parametry
Hr
Standardowa wartość HRESULT.
Uwagi
Ta funkcja jest używana przez kod ATL i MFC w przypadku warunku błędu. Można go również wywołać z własnego kodu. Domyślna implementacja tej funkcji zależy od definicji symbolu _ATL_NO_EXCEPTIONS i typu projektu, MFC lub ATL.
We wszystkich przypadkach ta funkcja śledzi hrESULT do debugera.
W programie Visual Studio 2015 Update 3 lub nowszym ta funkcja jest przypisywana __declspec(noreturn), aby uniknąć fałszywych ostrzeżeń SAL.
Jeśli _ATL_NO_EXCEPTIONS nie jest zdefiniowany w projekcie MFC, ta funkcja zgłasza wyjątek CMemoryException lub COleException na podstawie wartości HRESULT.
Jeśli _ATL_NO_EXCEPTIONS nie jest zdefiniowana w projekcie ATL, funkcja zgłasza wyjątek CAtlException.
Jeśli _ATL_NO_EXCEPTIONS jest zdefiniowana, funkcja powoduje błąd asercji zamiast zgłaszać wyjątek.
W przypadku projektów ATL można udostępnić własną implementację tej funkcji, która będzie używana przez usługę ATL w przypadku awarii. W tym celu zdefiniuj własną funkcję z tym samym podpisem co AtlThrow
i #define AtlThrow
jako nazwę funkcji. Należy to zrobić przed dołączeniem pliku atlexcept.h (co oznacza, że należy to zrobić przed dołączeniem żadnych nagłówków ATL, ponieważ atlbase.h zawiera atlexcept.h). Przypisz funkcję __declspec(noreturn)
, aby uniknąć fałszywych ostrzeżeń SAL.
Przykład
// 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 ..
};
Wymagania
Nagłówek: atldef.h
AtlThrowLastWin32
Wywołaj tę funkcję, aby zasygnalizować błąd na podstawie wyniku funkcji GetLastError
systemu Windows .
inline void AtlThrowLastWin32();
Uwagi
Ta funkcja śledzi wynik GetLastError
debugera.
Jeśli _ATL_NO_EXCEPTIONS nie jest zdefiniowana w projekcie MFC, ta funkcja zgłasza wyjątek CMemoryException lub COleException na podstawie wartości zwróconej przez GetLastError
.
Jeśli _ATL_NO_EXCEPTIONS nie jest zdefiniowana w projekcie ATL, funkcja zgłasza wyjątek CAtlException.
Jeśli _ATL_NO_EXCEPTIONS jest zdefiniowana, funkcja powoduje błąd asercji zamiast zgłaszać wyjątek.
Wymagania
Nagłówek: atldef.h