Skip to Main Content
Learning DCOM
book

Learning DCOM

by Thuan L. Thai
April 1999
Intermediate to advanced content levelIntermediate to advanced
502 pages
15h 5m
English
O'Reilly Media, Inc.
Content preview from Learning DCOM

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 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

Windows Internals, Fifth Edition

Windows Internals, Fifth Edition

David A. Solomon Mark E. Russinovich and Alex Ionescu
Windows® via C/C++, 5th Edition

Windows® via C/C++, 5th Edition

Jeffrey Richter, Christophe Nasarre
Learning Go

Learning Go

Jon Bodner

Publisher Resources

ISBN: 9781449307011Supplemental ContentErrata Page