Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.006 c
1-65042
Great DAN
2002-06-10 07:20
2002.06.20
Qrep


3-64909
777
2002-05-25 12:40
2002.06.20
DISTINCT


3-64985
Pavel_S
2002-05-28 15:55
2002.06.20
Оптимизация программы


3-64997
Cyrus
2002-05-29 10:46
2002.06.20
IBDataSet


3-64991
rashit
2002-05-28 18:17
2002.06.20
поиск в БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский