IonicWind Software

Aurora Compiler => Tips and Tricks => Topic started by: sapero on January 16, 2009, 05:39:55 AM

Title: Message Tables
Post by: sapero on January 16, 2009, 05:39:55 AM
Message tables are special string resources used when displaying error messages. They are declared in a resource file using the MESSAGETABLE resource-definition statement. To access the message strings, use the FormatMessage function.

The system provides a message table for the system error codes. To retrieve the string that corresponds to the error code, call FormatMessage with the FORMAT_MESSAGE_FROM_SYSTEM flag.

In this example we create a custom message table and use it with the FormatMessage function. To compile the message tabl;e script, you'll need Visual Studio (up to 2005), Platform SDK or MSDN. Find mc.exe and copy it to /system32 or your custom folder addded to the %PATH% envinronment variable.
If you do not find mc.exe, I have uploaded already compiled, binary resource (MSG00409.bin).

Attached is also a bat file which calls the message compiler, and additional h2inc tool which converts the generated C header to aurora or emergence.
h2inc aurora mesagetable.h
h2inc ebasic mesagetable.h


#include "windows.inc"
#include "messagetable.inc"

sub main()
{
dstring szError[256] = "Please compile mesagetable.mc first";
LPSTR pszArguments[2];

// simulate failing NEW
pointer pNew = NULL;//new(int, 5);
if (!pNew)
{
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, _hinstance+0, ERROR_NEW_FAILED, 0, szError, 256, NULL);
MessageBox(0, szError, "Error");
}

// simulate failing AllocHeap
heap pHeap = NULL;//AllocHeap(256);
if (!pHeap)
{
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, _hinstance+0, ERROR_ALLOCHEAP_FAILED, 0, szError, 256, NULL);
MessageBox(0, szError, "Error");
}

// simulate failing function
BOOL success = IsTrue(FALSE);
if (!success)
{
// The pszArguments[0] function failed to pszArguments[1]
pszArguments[0] = "IsTrue";
pszArguments[1] = "accept input parameter";

FormatMessage(FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_ARGUMENT_ARRAY,
_hinstance+0, ERROR_MY_FUNCTION_FAILED, 0, szError, 256, &pszArguments);

MessageBox(0, szError, "Error");
}
}


sub IsTrue(BOOL expression),BOOL
{
return expression;
}


More about message tables you can find in your MSDN, in Tools/SDK Tools/Resource Tools/Message Compiler.