Форум: "WinAPI";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
ВнизИспользование FormatMessage Найти похожие ветки
← →
serge1234 (2002-04-18 10:55) [0]Есть вот такой код:
procedure TForm1.Button1Click(Sender: TObject);
const
neutralLang : word = (SUBLANG_DEFAULT shl 10) or LANG_NEUTRAL;
var
h, retval, lasterr: cardinal;
msgbuf: array[0..1023] of char;
v: integer;
begin
v := StrToInt(Edit1.Text);
h := LoadLibraryEx("c:\winnt\system32\netmsg.dll", 0, LOAD_LIBRARY_AS_DATAFILE);
retval := FormatMessage(FORMAT_MESSAGE_FROM_HMODULE or
FORMAT_MESSAGE_IGNORE_INSERTS,
@h, v,
NeutralLang,
@msgbuf, 1024,
nil);
// обработка ошибки, возникшей при форматировании
if retval <> 0 then
application.MessageBox(msgbuf, "Error", MB_OK or MB_ICONSTOP)
else begin
lasterr := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or
FORMAT_MESSAGE_IGNORE_INSERTS,
nil, lasterr,
NeutralLang,
@msgbuf[0], 1024, nil);
application.MessageBox(msgbuf, "Error", MB_OK or MB_ICONSTOP);
end;
freelibrary(h);
end;
Формально я пытаюсь подгрузить netmsg.dll, и получить описание ошибки. Код ошибки передается через едит-бокс в формочке. Библиотека подгружается, а вот FormatMessage завершается с ошибкой. Ошибка 1812 - The specified image file did not contain a resource section. Может быть подскажет кто-нибудь, что здесь не так?
← →
watcher (2002-04-18 11:15) [1]может лучше использовать SysErrorMessage() ??
← →
serge1234 (2002-04-18 11:29) [2]Вариант с SysErrorMessage не подходит, т.к. описанный выше код - это попытка протестировать то, что стопроцентно должно работать. Чтобы не мучиться с поиском информации по ошибкам и файлам с описанием ошибок, взял пример из MSDN. На самом деле перед этим я пытался разобрать сообщения в EventLog"е. Там было то же самое.
← →
serge1234 (2002-04-19 09:37) [3]Покопался в дельфийских исходниках и в одном месте нашел использование FormatMessage с загрузкой внешнего модуля. Хэндл h должен передаваться как Pointer(h). Никогда не подумал бы! В MSDN"е всё было написано на мой взгляд несколько не так.
← →
vuk (2002-04-19 15:16) [4]to serge1234:
Судя по сообщению в файле отсутствует требуемый ресурс с текстом сообщения.
В EventLog Все несколько сложнее. Там помимо форматирования сообщения при помощи FormatMessage еще нужно вручную данные подставлять. Только что с этим боролся... Поборол, вроде как. :o)
>Хэндл h должен передаваться как Pointer(h).
Именно так. В MSDN так и написано:
lpSource
[in] Specifies the location of the message definition. The type of this parameter depends upon the settings in the dwFlags parameter. dwFlags Setting Parameter Type
FORMAT_MESSAGE_FROM_HMODULE Handle to the module that contains the message table to search.
FORMAT_MESSAGE_FROM_STRING Pointer to a string that consists of unformatted message text. It will be scanned for inserts and formatted accordingly.
← →
serge1234 (2002-04-19 17:30) [5]2vuk.
С EventLog"ом побороться проблем не составило - в зависимости от Source в событии лога читаем ключ в реестре, строчки-параметры передаем как массив строк и всё.
Единственное, что не смогло разобраться - событие 560
Object Open:
Object Server: Security
Object Type: File
Object Name: \Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolume2\WINNT\Installer\{00000409-78E1-11D2-B60F-006097C998E7}\wordicon.exe
New Handle ID: -
Operation ID: {0,30299921}
Process ID: 3508
Primary User Name: xxxxxxxx
Primary Domain: XXXXXX
Primary Logon ID: (0x0,0xBF2ED)
Client User Name: -
Client Domain: -
Client Logon ID: -
Accesses %%1538
%%1541
%%4416
%%4419
%%4423
%%4424
Privileges -
Вместо %% должны быть некие атрибуты, вот это как разобрать - я уже не в курсах. Если разобрал - может поделишься опытом?
← →
vuk (2002-04-19 18:57) [6]Расскажу кратко и не целиком, потому как слишком много рассказывать. Подробнее об этом можно почитать у Рихтера в книге "Программирование серверных приложений WIndows200".
Для каждого источника сообщений может быть зарегистрировано 2 DLL(или exe) содержащий ресурсы с информацией для формирования сообщения (на самом деле не 2, а 3, поскольку есть еще источник наименований категорий).
Предположим, что XXXX - название источника сообщения.
1. Само сообщение. Ссылка хранится в ключе реестра
SYSTEM\CurrentControlSet\Services\EventLog\XXXX\EventMessageFile
Это сообщение получается вызовом FormatMessage. Туда подставляются параметры, которые берутся из поля Strings структуры EVENTLOGRECORD. Подстановку делает сама функция FormatMessage.
2. Параметры сообщения. Ссылка хранится в ключе реестра
SYSTEM\CurrentControlSet\Services\EventLog\XXXX\ParameterMessageFile
В ресурсах этого модуля хранятся параметры сообщений. Дело в том, что для получения полного текста сообщения необходимо взять те самые фрагменты строки вида %%число и заменить их на строки, которые вернет функция FormatMessage, если это число ей передать в качестве идентификатора сообщения (ну и, соответственно, передать хендл нужного модуля). Эту замену нужно проводить вручную.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c