Winapi mesaj de eroare și manipulare mesaj, tutorial, cod q - un rus (ru)

API-ul Windows este furnizat utilizând interfața numită C. Succesul sau eșecul apelului API este raportat strict prin valorile returnate. Excepțiile nu fac parte dintr-un contract documentat (deși unele implementări API pot apela excepții SEH, de exemplu atunci când trec argumentul lpCommandLine numai în citire în CreateProcess).







  • Numai retur
  • Returnați valoarea cu informații suplimentare despre eșec
  • Valoarea returnată cu informații suplimentare despre eșec și succes
  • Returnați valoarea HRESULT

Documentația pentru fiecare apel API este apelată explicit, deoarece erorile sunt raportate. Consultați întotdeauna documentația.

Conversia unui cod de eroare într-o linie de mesaje

GetLastError returnează un cod numeric de eroare. Pentru a obține un mesaj descriptiv de eroare (de exemplu, pentru a fi afișat utilizatorului), puteți apela FormatMessage.

În C ++, puteți simplifica foarte mult interfața utilizând clasa std :: string.

NOTĂ. Aceste funcții funcționează și pentru valorile HRESULT. Doar modificați primul parametru de la DWORD dwErrorCode la HRESULT hResult. Restul codului poate rămâne neschimbat.

Eroare raportată ca valoare HRESULT

HRESULT s - valori numerice pe 32 de biți, în care biții sau intervalele de biți codifică informații bine definite. MSB este pavilionul de defecțiune / succes și biții rămași stochează informații suplimentare. Eșecul sau succesul pot fi determinate folosind macrosurile FAIL sau SUCCEEDED. HRESULT s sunt de obicei utilizate împreună cu COM, dar apar, de asemenea, în alte implementări decât COM (de exemplu, StringCchPrintf).

O eroare raportată numai de valoarea returnată

Unele apeluri API returnează un singur eșantion / eșec fără informații suplimentare (de exemplu, GetObject):

Un mesaj de eroare este raportat cu un mesaj de eroare

În plus față de valoarea de returnare / succes, unele apeluri API stabilesc de asemenea ultima defecțiune (de exemplu, CreateWindow). Documentația conține de obicei următoarea formulă standard pentru acest caz:







Dacă funcția este reușită, valoarea returnată <значение успеха API>.
Dacă funcția nu funcționează, valoarea returnată <значение ошибки API>. Pentru a obține informații extinse privind erorile, sunați la GetLastError.

Este imperativ să obțineți imediat LASTError () IMEDIAT. Ultimul cod de eroare poate fi suprascrise de orice altă funcție, așa că, dacă între defectat și apel GetLastError () va GetLastError () un apel de funcție suplimentară, revenind la GetLastError () nu va mai fi de încredere. Fiți deosebit de atent atunci când lucrați cu constructori C ++.

Odată ce primiți codul de eroare, va trebui să îl interpretați. Puteți obține o listă exhaustivă de coduri de eroare în MSDN pe pagina Coduri de eroare de sistem (Windows). În plus, puteți să vă uitați în fișierele antetului sistemului; Fișierul cu toate constantele codului de eroare este winerror.h. (Dacă aveți un SDK oficial de la Microsoft pentru Windows 8 sau o versiune ulterioară, acesta se află într-un dosar partajat cu folderul inclus.)

Note despre apelarea GetLastError () în alte limbi de programare

.net (C #, VB, etc.)

Cu .net nu trebuie să invocați direct P / Invocare la GetLastError (). Acest lucru se datorează faptului că timpul de executare a .net va face ca alte aplicații Windows API să solicite aceleași fire în spatele tău. De exemplu, colectorul de gunoi poate apela VirtualFree () dacă găsește suficientă memorie pe care nu o mai folosește și se poate întâmpla între apelul de funcție alocat și apelul dvs. către GetLastError ().

În schimb, .net oferă Marshal.GetLastWin32Error (). care va prelua ultima eroare de la ultimul apel P / invocat pe care l-ați făcut. Utilizați acest lucru în loc să apelați direct GetLastError ().

(.net nu pare să te oprească din importul GetLastError () oricum, nu știu de ce.)

Diversele instrumente furnizate de Go pentru apelarea funcțiilor DLL (care se găsesc atât în ​​pachetul syscall, syscall, cât și în pachetul golang.org/x/sys/windows) returnează trei valori: r1. r2 și err. r2 nu este niciodată folosit; Puteți utiliza un identificator gol. r1 este valoarea de retur a funcției. err este rezultatul unui apel la GetLastError (), dar este convertit într-un tip care implementează eroarea. astfel încât să puteți transmite funcțiile de apelare pentru procesare.

Din moment ce Go nu știe când să sune GetLastError (), și când nu, va întoarce întotdeauna o eroare zero. Prin urmare, o eroare tipică de gestionare a erorilor Go

nu va funcționa. În schimb, ar trebui să verificați r1 în același mod ca și C și să utilizați numai err dacă indică faptul că funcția a returnat o eroare:

O eroare a fost raportată cu informații suplimentare despre eșec și succes

Unele apeluri API pot reuși sau nu în mai multe moduri. API-ul returnează, de obicei, informații suplimentare pentru apelurile și erorile de succes (de exemplu, CreateMutex).







Trimiteți-le prietenilor: