Using the FormatMessage Function

Recall that you must check the returned HRESULT for all COM API function and method invocations, because the HRESULT is an important element in determining what has gone wrong in the most recent COM-related call. In the following code snippet, if the returned HRESULT is bad, we call a special helper function, DisplayError, to display the error message associated with the HRESULT:

HRESULT hr = pOcr->OcrImage(. . .);
if (FAILED(hr)) DisplayError(hr);

To obtain the textual representation of a system-defined HRESULT, you can use the FormatMessage Win32 API function. Here’s the DisplayError helper function that uses FormatMessage to obtain the error string associated with a particular status code.

void DisplayError(HRESULT hr)
{
   if (hr == S_OK) return;

   if (HRESULT_FACILITY(hr) == FACILITY_WINDOWS)
      hr = HRESULT_CODE(hr);

   wchar_t *pwszStatus;
   // FormatMessageW is the Unicode version of FormatMessage.
   FormatMessageW(
      FORMAT_MESSAGE_ALLOCATE_BUFFER |
      FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      hr,
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
      (LPWSTR)&pwszStatus,
      0,
      NULL
   );

   // MessageBoxW is the Unicode version MessageBox.
   MessageBoxW(NULL, pwszStatus, L"DisplayError", MB_OK);

   LocalFree(pwszStatus);
}

The previous code snippet displays the error string associated with an HRESULT. This information helps tremendously in debugging your code, since it presents to you the exact problem that has occurred in the last COM-related invocation. For example, if a piece of client code ...

Get Learning DCOM now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.