[WinAPI] De ce da eroare o functie Windows API?

Folosire Windows API in programe C/C++ (forum moderat)

[WinAPI] De ce da eroare o functie Windows API?

Mesajde Ovidiu Cucu » 16 Iul 2007, 21:47

Problema
Multe functii Windows API intorc FALSE (0) pentru a semnaliza eroare. Cum pot afla mai concret cauza erorii?

Rezolvare
Ne uitam in MSDN la documentatia functiei respective. La majoritatea scrie "... to get extended error information, call GetLastError".
Deci, facem cum se spune acolo.

Exemplu
Cod: Selectaţi tot
   BOOL bRet = ::CreateDirectory(_T("c:\\myprj\\logs"), NULL);
   if(! bRet)
   {
      DWORD dwError = ::GetLastError(); // put a breakpoint here!
   }

Daca sintem in mod DEBUG, putem simplu pune un breakpoint, lua valoarea introarsa de GetLastError si folosi utilitarul "Error Lookup" care este furnizat cu Visual C++ (vezi meniul Tools/Error Lookup) pentru a vedea descrierea erorii.

Mai departe, daca vrem sa se afiseze descrierea errorii la run-time, se poate apela functia FormatMessage.

Exemplu
Cod: Selectaţi tot
void ReportWinAPIError(DWORD dwError)
{
   LPCTSTR pszCaption = _T("Windows API Error");
   const DWORD dwFormatControl = FORMAT_MESSAGE_ALLOCATE_BUFFER |
                                 FORMAT_MESSAGE_IGNORE_INSERTS |
                                 FORMAT_MESSAGE_FROM_SYSTEM;
   LPVOID pTextBuffer = NULL;
   DWORD dwCount = ::FormatMessage(dwFormatControl, NULL, dwError, 0,
                                   (LPTSTR)&pTextBuffer, 0, NULL);
   if(0 != dwCount)
   {
      ::MessageBox(NULL, (LPCSTR)pTextBuffer, pszCaption, MB_OK|MB_ICONERROR);
      ::LocalFree(pTextBuffer);
   }
   else
   {
      ::MessageBox(NULL, _T("Unknown error"), pszCaption, MB_OK|MB_ICONERROR);
   }
}

Cod: Selectaţi tot
   BOOL bRet = ::CreateDirectory(_T("c:\\myprj\\logs"), NULL);
   if(! bRet)
   {
      ReportWinAPIError(::GetLastError());
   }


NOTA: Sunt functii WinAPI care intorc alte valori decat FALSE pentru a semnaliza o eroare.
De exemplu, functia CreateFile intoarce INVALID_HANDLE_VALUE iar RegOpenKeyEx intoarce direct codul de eroare.
Totul e ca atunci cand folosim o functie Windows API, sa studiem documentatia si sa nu lasam de izbeliste cazurile de eroare.

Un mic tip legat de Visual Studio il puteti gasi la


<< Back to Windows API Index
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3772
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Înapoi la Windows API

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 2 vizitatori

cron