Re: HRESULT
* Joseph M. Newcomer:
See below...
On Fri, 28 Mar 2008 19:31:17 +0100, "Alf P. Steinbach" <alfps@start.no> wrote:
* Giovanni Dicanio:
Maybe FormatMessage with HRESULT works only for some APIs (like when you
successfully used it) but not for all...
FormatMessage is a general message formatting and retrieval facility, supporting
internationalization, in a crude form, as well as message parameters.
It works with plain error codes, too (choosing error code interpretation
ERROR_SUCCESS for numerical value 0).
It retrieves messages from message modules. When you specify "system" flag it
uses modules that contain the [winerror.h] error messages, plus some. For some
APIs, e.g. like RAS, where the "system" flag isn't sufficient, message module
DLLs are (still undocumented, AFAIK) available (quirk, don't know if it's still
that way in XP and Vista: the documententation used to say you could specify
"system" plus a module, but that didn't use to work, you could use one or other
but not both).
*****
I have not used a version of Windows in which it did not work. You must have been doing
something wrong.
****&
The code was correct. And your inference is not logically sound.
To build your own message modules you use the Message Compiler (MC), which is
under-documented.
E.g., you would do that in order to log messages to the event log.
If all you want is the "system" messages, there's not much point in using
FormatMessage directly, at least with Visual C++.
****
Why? Am I supposed to wire in several thousand strings of my own?
No, that's again an invalid inference. You can ->
****
Instead you can simply use the compiler's intrinsic COM support, which does the
lookup for you.
****
The "compiler" has no "intrinsic" COM support.
Silly me.
Pardon me, but I'm laughing.
The MFC *libraries* allow you to use it,
but it has nothing to do with the compiler. Except for the .tlb support provided by
#import, the compiler doesn't even know COM exists.
That, Mr. Newcomer, is fortunately /also/ incorrect. :-)
The Visual C++ compiler's support for COM is very extensive, involving both
syntactical structures with COM-specific keywords, and library components
documented as "Compiler COM Support Classes".
The intrinsic COM support is essentially the COM support you have when you
subtract MFC and ATL from a basic Visual C++ installation.
So instead of a trivial API, I have to use all of COM to decode an error message? What
part of "simplicity" did I miss here?
<code>
#include <iostream>
#include <ostream>
#include <comdef.h> // Intrinsic COM support lib components.
#include <winerror.h>
int main()
{
using namespace std;
long const e = ERROR_CLASS_ALREADY_EXISTS;
cout << _com_error( e ).ErrorMessage() << endl;
}
</code>
<output>
Class already exists.
</output>
Cheers, & hth.,
- Alf
PS: Why post so much rubbish, trying to goad someone into helping you and making
a fool of yourself, when you can simply /ask/? I don't understand. But I
assume "Joseph M. Newcomer" is not your real name.
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?