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

Folosire Windows API in programe C/C++ (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi

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

Post by Ovidiu Cucu » 16 Jul 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

Code: Select all

   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

Code: Select all

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);
   }
}

Code: Select all

   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



Post Reply