Cum utilizam corect GetLastError pentru a obtine codul de eroare dupa un apel de functie WinAPI?
Raspuns
- In primul rand, aruncam un ochi in documentatie sa vedem daca functia data seteaza last-error code (valoarea care va fi returnata de GetLastError). Daca da, de obicei exista o referire la GetLastError in sectiunea "Return Values" (exemplu: "To get extended error information, call GetLastError").
- Vedem ce valoare intoarce functia in caz de eroare. Poate fi zero, un handle NULL sau o alta valoare cum ar fi INVALID_HANDLE_VALUE.
- In fine, testam in cod valoarea returnata iar in caz de eroare chemam GetLastError.
Code: Select all
BOOL bRet = ::DeleteFile(pszFileName);
if(! bRet) // DeleteFile function has failed
{
DWORD dwError = ::GetLastError();
// ...
}
Code: Select all
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
if(NULL == hProcess) // OpenProcess function has failed
{
DWORD dwError = ::GetLastError();
// ...
}
Code: Select all
HANDLE hFind = ::FindFirstFile(pszFileName, &findData);
if(INVALID_HANDLE_VALUE == hFind) // FindFirstFile function has failed
{
DWORD dwError = ::GetLastError();
// ...
}
- Nu toate functiile WinAPI seteaza pe zero last-error code in caz de succes.
O greseala destul de frecventa pe care o fac programatorii este de a chema GetLastError fara ca mai inainte sa vada daca functia a esuat sau nu. In exemplul urmator, GetLastError intoarce valoarea 8 (ERROR_NOT_ENOUGH_MEMORY) chiar daca functia LoadImage a avut succes.Code: Select all
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, pszFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); DWORD dwError = ::GetLastError(); // This is wrong! You have to call GetLastError only if hBitmap is NULL.
- Unele functii WinAPI (e.g. RegQueryValueEx) intorc direct codul de eroare deci nu mai are sens sa chemam GetLastError.
In orice caz, trebuie mai intai de vazut in documentate daca o functie data seteaza last-error sau nu.