2014-06-10 115 views
0

我正在製作一個使用winhttp庫的程序。爲了處理各種異常,我創建了一個頭文件。通過使用傳遞給異常類的GetLastError()函數作爲DWORD變量拋出錯誤。但是我想打印錯誤的描述,而不僅僅是錯誤編號。我試着用的FormatMessage功能,其工作差錯6,但不是爲別人即錯誤12002.我使用它喜歡:如何使用錯誤代碼獲取winhttp錯誤的描述?

WinHttpException(DWORD error) 
    { 
     LPTSTR lpszFunction = "Function"; 
     LPVOID lpMsgBuf; 
     LPVOID lpDisplayBuf; 
     DWORD dw = error; 

     FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | 
      FORMAT_MESSAGE_FROM_SYSTEM | 
      FORMAT_MESSAGE_IGNORE_INSERTS, 
      NULL, 
      dw, 
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
      (LPTSTR) &lpMsgBuf, 
      0, NULL); 

     // Display the error message and exit the process 

     lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
      (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); 

     StringCchPrintf((LPTSTR)lpDisplayBuf, 
      LocalSize(lpDisplayBuf)/sizeof(TCHAR), 
      TEXT("%s failed with error %d: %s"), 
      lpszFunction, dw, lpMsgBuf); 

     MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

     m_message = boost::lexical_cast<std::string>(lpDisplayBuf); 
    } 

我從Microsoft link得到這個代碼..是否有任何其他方式做到這一點?或者我應該在FormatMessage函數中使用哪些參數來使其工作? 在此先感謝。

+0

你應該叫'LocalFree()'像微軟比如你已經鏈接以防止兩次內存泄漏。 – PowerGamer

回答

2

WinHTTP的錯誤信息都包含在winhttp.dll模塊和​​功能允許您使用FORMAT_MESSAGE_FROM_HMODULE標誌(按FormatMessage() documentation)來檢索它們:

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_HMODULE | 
    FORMAT_MESSAGE_IGNORE_INSERTS, 
    reinterpret_cast<LPCVOID>(GetModuleHandle(TEXT("winhttp.dll"))), 
    dw, 
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
    reinterpret_cast<LPTSTR>(&lpMsgBuf), 
    0, NULL);