Udostępnij za pośrednictwem


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 GetLastErrorsystemu 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 AtlReportErrorprogramu , 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 GetLastErrorsystemu 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

Zobacz też

Funkcje
Makra debugowania i raportowania błędów