WinAPI hibaüzenet és az üzenet feldolgozása, bemutató, kód q - egy orosz (ru)

API a Windows, amelyet egy, a C-indukált felület. Siker vagy kudarc közlik API hívás szigorúan keresztül visszatérési értékeket. Kivételek nem része dokumentált szerződés (bár bizonyos API végrehajtásához okozhat PSZ kivétel. Például, amikor elhalad egy érv lpCommandLine csak olvasható CreateProcess).

  • Csak a visszatérési érték
  • Visszatérési érték további információt a hiba
  • Visszatérési érték további információt a kudarc és a siker
  • Visszatérési érték HRESULT

A dokumentáció minden API hívás kifejezetten hivatkozott jelentése szerint a hibát. Mindig olvassa el a dokumentációt.

Átalakítani a hibakódot az üzenet sorban

GetLastError vissza hibakódot. Ahhoz, hogy egy leíró hibaüzenetet (pl. A kijelző a felhasználó számára), akkor hívja FormatMessage.

A C ++, akkor nagyban egyszerűsíti a felületet, std :: string osztályból.

Megjegyzés. Ezek a funkciók is működnek egy HRESULT. Csak cserél az első paraméter duplaszónak dwErrorCode a HRESULT HRESULT. A többi kód változatlan marad.

A hibaüzenetek egy HRESULT

HRESULT s - 32-bites numerikus értékeket, ahol bitek vagy tartomány bit kódolásához egy világosan meghatározott információt. MSB - egy kudarc / sikert zászló, és a fennmaradó biteket tároljuk a további információkért. Sikertelensége vagy sikere lehet meghatározni a sikeres vagy sikertelen makrókat. HRESULT s jellemzően együtt használják COM, hanem megjelenítésére implementációinak eltérő COM (például, StringCchPrintf).

A hibaüzenet csak vissza értéket

Néhány API hívások visszaút egyetlen jelző hiba / siker nélkül további információkat (pl GetObject):

Ez hibát jelentett hibaüzenettel

Amellett, hogy a visszatérési értéke meghibásodás / siker az egyes API hívások rögzített utolsó hiba hiba (például CreateWindow). Dokumentáció általában a következő szokásos megfogalmazás ebben az esetben:

Ha a függvény sikeres, a visszatérési érték <значение успеха API>.
Ha a funkció nem működik, a visszatérési érték <значение ошибки API>. Ahhoz, hogy a kiterjesztett hiba információért hívja GetLastError.

Nagyon fontos, hogy azonnal GetLastError (azonnal). Az utolsó hibakód felülírható minden más funkció, így ha a sikertelen és a Call GetLastError () fog GetLastError () egy kiegészítő funkció hívás visszatérő GetLastError () már nem lesz megbízható. Legyen különösen óvatos, ha dolgozik, a tervezők a C ++.

Ha már a hibakód, akkor kell értelmezni őket. Tudod kap átfogó listát hibakódok az MSDN oldalt a rendszer hibakódok (Windows). Ezen felül, akkor nézd a fájlokat a rendszer fejlécfájljait Fájl minden állandók a hibakód - Winerror.h. (Ha van egy hivatalos SDK a Microsoft a Windows 8 vagy újabb, akkor a megosztott mappát, amelyben a mappát.)

Megjegyzések a hívó GetLastError () más nyelveken

.nettó (C #, VB, és T. D.)

.NET akkor nem kell P / Indítsunk a GetLastError () közvetlenül. Ez annak a ténynek köszönhető, hogy a végrehajtás .NET hogy más Windows API hívások az azonos áramot a hátad mögött. Például a szemétgyűjtő okozhat VirtualFree () amennyiben úgy találja elég memória, amely már nem használ, és ez megtörténhet között a kijelölt funkció hívást, és a hívás GetLastError ().

Ehelyett .NET Marshal.GetLastWin32Error (). amely letölti a legutóbbi hibát az utolsó hívás P / Invoke, amelyet te magad tettél. Használja ezt nem közvetlenül hívja GetLastError ().

(.NET, nem úgy tűnik, hogy akadályozza meg az importáló GetLastError () Egyébként, nem vagyok benne biztos, hogy miért.)

Előírt különböző eszközök Ide hívja DLL-függvények (amelyek mind a syscall csomag syscall és golang.org/x/sys/windows zsák) visszakerül három érték: R1. r2, és err. r2 soha nem használt; Használhatja az üres azonosítót. r1 - a visszatérési érték a funkciót. err hívás eredményeit GetLastError (), de átalakul olyan típus, amely végrehajtja a hibát. így át meghívja a funkció feldolgozásra.

Mivel a Go nem tudja, mikor kell hívni a GetLastError (), és amikor nem, akkor mindig hibaüzenetet nulla. Ezért egy tipikus hiba-kezelő idióma Go

Ez nem fog működni. Ehelyett meg kell ellenőrizni r1 ugyanúgy, mint a C-ben, és csak tévesen amikor jelzi, hogy a funkció hibát jelzett:

Ez hibát jelentett további információt a kudarc és a siker

Néhány API hívások sikerül, vagy nem több, mint egy út. API jellemzően visszatér további információ sikeres hívások, valamint a hiba (például CreateMutex).