[Из песочницы] MC.exe (Message compiler), rc.exe, link.exe для формирования .dll для EventMessageFile

Добрый день, уважаемые читатели Хабра. Данный пост представляет из себя гайд по созданию динамической библиотеки .dll, которая содержит в себе сообщения, необходимые для отображения в кастомном логере, располагающимся в Windows Event Viewer\Application and Services Logs\уууу (в качестве примера).

j304wqiveg_ocgnbq0oddjzx-e8.png
В кастомном логе можно часто увидеть сообщения, описание которых содержит:

wm4f6xi5nirwkay2aozgtdemc9w.png

Это означает, что источник событий yyyy не содержит в себе необходимый набор ID и Description.

Для того, чтобы исправить данную ситуацию, необходимо:

1. Открыть regedit по следующему пути: HKLM\SYSTEM\CurrentControlSet\Services\EventLog и убедиться в существовании вашего раздела.

2. Создать eventMessage.txt в который необходимо поместить ваши параметры, пример с msdn, сохранить в необходимой кодировке Windows-1251 или Unicode и формате eventMessage.mc.

Примечание: при наполнении eventMessage вашими ID и description ВСЕГДА после описания необходимо ставить точку с новой строки, и после нее переводить каретку на новую строку.

Пример:

MessageId=0x1
SymbolicName=CAT_1
Language=English
OutDescription for your application
.

MessageId=0x2


Если не учесть данной особенности, то могут быть непредвиденные ошибки во время компиляции.

3. Запустить cmd от имени администратора.

4. Выполнить команду: mc.exe -u C:\SomeFolder\eventMessage.mc -r C:\SomeFolder\result

Примечание: mc.exe, в частном случае, находится в C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x86 вместо формата -u (Unicode) можно использовать -A (W-1251 или ANSI, данный формат по умолчанию), а параметр -rявляется выходным расположением, куда будут сохранены файлы после компиляции.

После выполнения команды будут созданы: бинарный файл и файл eventMessage.rc в C:\SomeFolder\result

5. Выполнить команду: rc.exe C:\SomeFolder\result\eventMessage.rc

Примечание: rc.exe находится в том же каталоге, где и mc.exe.

После компиляции будет создан файл eventMessage.res, который необходим для создания динамической библиотеки.

6. Выполнить команду: link.exe -dll -noentry /out: C:\SomeFolder\result\OurMessageSet.dll C:\SomeFolder\result\eventMessage.res.

Примечание: link.exe находится, в частном случае, в C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\SDK\ScopeCppSDK\VC\bin

7. Поздравляю, мы создали с Вами долгожданную библиотеку, но это еще не все. Заходим в regedit к нашему каталогу из шага 1. В поле каталога создаем строковый параметр (string value), именуя сиё творение в EventMessageFile, а в значении указываем путь до нашей библиотеки: C:\SomeFolder\result\OurMessageSet.dll. Выглядит это так:

nnrngqo4gc07oq8kcicz2pc0okc.png

Рассмотренные инструменты: mc.exe, rc.exe, link.exe.

Да пребудет с Вами сила.

© Habrahabr.ru