Using the _com_error Class
The Visual C++ compiler-level support for COM includes a class called _com_error. In order to use this class, you must include comdef.h. Like the FormatMessage technique, this class allows you to display the error string of an associated HRESULT
. Moreover, this class allows you to deal with COM exceptions via the IErrorInfo interface. An abbreviated class definition of _com_error follows:
class _com_error { public: // Constructors _com_error(HRESULT hr, IErrorInfo* perrinfo = NULL) throw(); // Accessors HRESULT Error() const throw(); // IErrorInfo method accessors _bstr_t Description() const throw(_com_error); // FormatMessage accessors const TCHAR * ErrorMessage() const throw(); . . . };
Using this class, you can simply display the error message associated with the bad HRESULT
by calling the _com_error::ErrorMessage method, as shown here:
HRESULT hr = pOcr->OcrImage(. . .);
if (FAILED(hr)) {
_com_error error(hr);
MessageBox(NULL, error.ErrorMessage(), L"Error", MB_OK);
}
The _com_error class is better than the FormatMessage technique because it can deal with COM exceptions via IErrorInfo. For example, the following code snippet is similar to the previous code. However, it is expanded to check for COM exception support that is provided by the object. Notice that if the object doesn’t support COM exceptions, you pass only the HRESULT
into the constructor of _com_error, but if the object supports COM exceptions, you pass both the HRESULT
and the IErrorInfo ...
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.