Глобально все выглядит так. Создается текстовый файл по правилам необходимым Message Compiler (MC.EXE) вот для примера кусочек этого файла.
MessageId=0x1 Severity=Error Facility=Runtime SymbolicName=MSG_BAD_COMMAND Language=English You have chosen an incorrect command.
Дальше используется утилита MC, которую можно найти по пути:
Диск:\Program Files\Microsoft Visual Studio\VC98\Bin
Она используется для преобразования текстового файла в бинарный файл. Когда бинарный файл готов его нужно добавить в ресурсы.
nameID MESSAGETABLE filename
Все, остается только скомпилировать проект и функция FormatMessage сможет извлекать информацию об ошибке. Обратите внимание, что в утилите Error Lookup (подробнее "Шаг 32 - Просмотр описания ошибки") есть возможность указания модуля для извлечения ошибки.
Так и в функции FormatMessage (подробнее - "Шаг 33 - Как работает Error Lookup") можно указать модуль, из которого ошибка извлекается, для этого в функции FormatMessage можно использовать второй параметр LPCVOID lpSource, куда передать указатель на загруженную DLL – HMODULE. Загружается DLL обычно функцией LoadLibrary при явном вызове (подробнее - "Шаг 41 - Явный вызов функций DLL").