Статьи по Делфи
Меню сайта


Категории каталога
Мои статьи [2]
Функции и процедуры Win Api [20]
Работа с мышью [10]
Реестр и Делфи [11]
Работа с файлами [38]
Делфи и Хакер [10]
Инсталлятор собственными руками [6]
Хитрости в делфи [3]
Работа с системой [19]


Форма входа


Поиск по каталогу


Друзья сайта


Наш опрос
Понравились ли вам треки
Всего ответов: 156


Приветствую Вас, Гость · RSS 2025-12-30, 6:24 AM
Начало » Статьи » Функции и процедуры Win Api

Запись сообщений в журнал событий Windows на Delphi
Приложение может записывать сообщения в журнал используя следующие функции WinAPI. Подробное описание параметров этих функций содержится в документации к API.
RegisterEventSource - Открывает handle для доступа к журналу на локальной или удаленной машине.
ReportEvent - Собственно записывает сообщение.

Для записи сообщений в журнал в упрощенной манере просто произведите вызов RegisterEventSource с именем машины (UNC), в журнал которой вы хотите поместить сообщение (nil для локальной машины), и именем события. Имя события это обычно имя приложения, но может быть чем-то более информативным. Как только источник событий зарегистрирован, можно записывать события при помощи ReportEvent с handle, который вернула RegisterEventSource.

Листинг 1. Пример

VAR EventLog:THandle;
EventLog:=RegisterEventSource(nil,PChar(′MyApplication′));

VAR MyMsg:Array[0..2] of PChar;
MyMsg[0]:=′A test event message′;

ReportEvent(EventLog,EVENTLOG_INFORMATION_TYPE,0,0,nil,1,0,@MyMsg,nil);

Однако текст сообщения, записанного в журнал будет предварен текстом: "The description for Event ID ( 0 ) in Source ( MyApplication ) cannot be found. The local computer may not have necessary registry information or message DLL files to display messages from a remote computer. The following information is part of the event:" (Не найдено описание для события с кодом ( 0 ) в источнике ( MyApplication ). Возможно, на локальном компьютере нет нужных данных в реестре или файлов DLL сообщений для отображения сообщений удаленного компьютера. В записи события содержится следующая информация:) (Замечание: Это сообщение специфично для Windows2000 и может немного отличаться на других версиях). Для предотвращения появления этого текста необходимо внести в реестр некоторые ключи, как показано ниже, и определить строковые ресурсы (это может быть выполнено любым компонентом вашего приложения, не обязательно приложением, которое будет записывать события). Соответствующие записи реестра описаны ниже. Примеры кода предполагают, что строковые ресурсы и категории расположены в том же исполняемом файле, который содержит программу, записывающую события. Ключи категорий являются опциональными. Смысл этих ключей реестра и строковых ресурсов в том, что журнал событий использует строку, а приложение записывает в журнал в виде форматированного аргумента, и журналу необходимо знать, где находится описатель формата для этой строки. Кроме того, в журнале может храниться информация о категории события, полезная для просмотра событий. Это удобнее, чем просто отображать множество однотипный событий "Нет". Самый простой определитель формата это %1, который просто передаст в журнал входную строку. Для более подробного изучения определителей формата см. API документацию для FormatMessage.
Ключи реестра

Создайте следующий ключ реестра:

HKEY_LOCAL_MACHINESYSTEM - CurrentControlSet - Services - Eventlog - Application -

Имя приложения AppName должно совпадать с именем источника, использованного при вызове RegisterEventSource, потому что просмотрщик событий будет использовать это имя для отыскивания событий.

Создайте следующие ключи:

CategoryCount (Optional) - Integer - Количество категорий событий, которые вы собираетесь использовать. (Это максимальная величина, и не будет проблем, если не все категории на самом деле будут применяться).
CategoryMessageFile (Optional) - String - Файл, содержащий ресурсы строк категорий.
EventMessageFile - String - Файл, содержащий ресурсы строк событий.
TypesSupported - Integer - Допустимые типы событий.

Листинг 2. Пример кода для создания необходимых записей в реестре

VAR
Reg:TRegistry;
RegKey:String;
AppPath:String;
AppName:String;
NumCategories:Integer;

Begin
Reg:=TRegistry.Create;
Try
AppPath:=Application.ExeName;
AppName:=′MyApplication′;
NumCategories:=2;
RegKey:=
Format(′SYSTEMCurrentControlSetServicesEventLogApplication%s′,[AppName]);
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey(RegKey,True);
// Собственное имя
Reg.WriteString(′CategoryMessageFile′,AppPath);
// Собственное имя
Reg.WriteString(′EventMessageFile′,AppPath);
// Максимальное количество категорий
Reg.WriteInteger(′CategoryCount′,NumCategories);
// Разрешаем все типы
Reg.WriteInteger(′TypesSupported′,EVENTLOG_SUCCESS or
EVENTLOG_ERROR_TYPE or
EVENTLOG_WARNING_TYPE or
EVENTLOG_INFORMATION_TYPE);
Reg.CloseKey;
EventLog:=RegisterEventSource(nil,PChar(AppName));
Finally
Reg.Free;
End; //try..finally

End;

Сообщение и ресурсы категорий.

Информация, помещаемая в реестр вышеприведенным кодом, информирует журнал событий о том, где искать строки событий и категорий, основываясь на имени источника, которое использует приложение для записи в журнал. И, как мы уже говорили, чтобы журнал событий искал эти строки в нашем исполняемом файле, нам нужно включить эти строковые ресурсы в наш файл. Этот процесс состоит из следующих шагов:
Написание исходного файла таблицы сообщений (файл .mc).
Компиляция .mc файла при помощи Microsoft message compiler.
Подключение получившейся информации к нашему Delphi приложению.

Есть много примеров по написанию .mc файлов в Windows SDK и на различных сайтах, включая MSDN, однако документация не достаточно проста, поэтому приводим минимально достаточное описание для создания файла таблицы сообщений:

Листинг 3. Код Delphi/Pascal

;//Example Message source file exmess.mc
MessageId=0
Language=English
%1
.

MessageId=1
Language=English
Category1
.

MessageId=2
Language=English
Category2
.

Строки, начинающиеся с ;// являются комментариями и не компилируются. Этот пример содержит три строковых ресурса - один определитель формата сообщения и две категории, хотя файл может содержать только первый ресурс. Каждый ресурс отделен одной отдельной точкой на строке, так же, как и в конце файла. Если в конце файла отсутствует перевод строки после точки, то файл не будет скомпилирован. Первая строка каждого ресурса является MessageID (index), при помощи которого приложение будет обращаться к строке. Следующая строка указывает язык ресурса. В нашем случае "English" - означает international English, язык по умолчанию для всех Windows платформ. Информацию по многоязыковым ресурсам см. в справке к компилятору ресурсов. Последняя строка определяет собственно текст сообщения. В случае ресурса 0, строка будет "%1", что означает, что передается сама строка. Если, например, нужен префикс сообщения "An Event Message" (Сообщение события), то строка будет иметь вид: "An Event Message %1". Более полное описание форматов см. в API справке по FormatMessage и компилятору ресурсов. Ресурсы категорий не требуют форматированных аргументов. Как видно в примере, мы определили две категории "Category1" и "Category2". Следующий этап - компиляция .mc файла при помощи Microsoft message compiler (mc.exe), который можно взять у Microsoft (входит в состав Platform SDK). Наш пример, имеющий имя "exmess.mc" может быть скомпилирован из командной строки таким образом:

Mc exmess.mc

В результате получаем три файла: exmess.rc, bin00001.msg и exmess.h. emess.h может быть использован как заголовочный файл для обращения к ресурсам по их символическим именам, если таковые указаны (в нашем примере нет). .bin файл это откомпилированный бинарный ресурс с сообщениями, .rc это файл ресурсов Windows. Он может быть откомпилирован в Delphi .res файл при помощи brcc32.exe - компилятора ресурсов Delphi или просто добавлен в проект при помощи project manager, и тогда Delphi автоматически его откомпилирует при компиляции проекта (build).

Запись событий с категориями.

Теперь наше приложение имеет ресурсы и необходимые записи в реестре или код, который их внесет. Значит, приложение может записывать события в журнал без сообщения об отсутствии ресурсов и с добавочным индексом категории события:

Листинг 4. Код Delphi/Pascal

VAR EventLog: THandle;
EventLog:=RegisterEventSource(nil,PChar(′MyApplication′));

VAR MyMsg:Array[0..2] of PChar;
MyMsg[0]:=′A test event message′;

ReportEvent(EventLog, EVENTLOG_INFORMATION_TYPE,1,0,nil,1,0,@MyMsg,nil);

Вышеприведенный код запишет событие в журнал с текстом "A test event message" и, потому что 1 следует за параметром EventLogType, это будет событие категории "Category1". Это достигнуто указанием 0 в качестве идентификатора события, который соответствует определителю формата в ресурсе 0 ("%1"). В результате текст сообщения события будет передан без изменения. Точно так же, категория указана 1, что соответствует "Category1" в нашем ресурсе 1. Журнал событий поддерживает "живую связь" с файлами сообщений и категорий, указанных в реестре, что означает, что когда пользователь захочет просмотреть журнал, просмотрщик событий получит доступ к файлам ресурсов для детального отображения событий. Это также означает, что если вы создадите множество событий, при помощи указанного файла ресурсов, и, затем, измените значения в файле ресурсов и произведете обновление (refresh) в просмотрщике событий, тексты событий и номера категорий так же изменятся в соответствии с ресурсами. Точно так же, если файл ресурсов вдруг будет удален или записи в реестре будут уничтожены или повреждены, то журнал не сможет получить доступ к ресурсам, и отобразит сообщение с ошибкой в виде префикса события, как было описано в начале статьи. В этом случае вместо номера категории события будет отображен индекс категории.

Категория: Функции и процедуры Win Api | Добавил: Admin (2006-12-16) | Автор: M@ster
Просмотров: 118928 | Комментарии: 1912 | Рейтинг: 5.0 |

Всего комментариев: 981 2 3 ... 9 10 »
98 canadian pharmaceuticals online  
0
Wonderful work! That is the kind of info that are meant to be shared around the internet. Shame on Google for now not positioning this publish higher! Come on over and visit my site . Thank you =)

97 BuddyBed  
0
рост небрендового трафика https://proffseo.ru/prodvizhenie-sajtov-po-rf

Еще истории успеха https://proffseo.ru/privacy

+ Получите:
Каталог https://proffseo.ru/prodvizhenie-sajtov-po-moskve

7 ключевых особенностей продвижения сайта по всей России https://proffseo.ru/kontakty

SEO продвижение сайтов в Москве https://proffseo.ru/prodvizhenie-sajtov-po-moskve

96 BuddyBed  
0
ВАЖНО: понятие геоНЕзависимой выдачи в Яндексе очень условно https://proffseo.ru/
Сотрудники Yandex на «Вебмастерских» конференциях неоднократно заявляли, что не бывает выдачи Яндекса без региона https://proffseo.ru/privacy

Последнее обновление: 27 июня 2024 года https://proffseo.ru/prodvizhenie-sajtov-po-rf

Если масштабы бизнеса охватывают всю территорию РФ, а не только региональные центры (вроде Москвы, Санкт-Петербурга, Нижнего Новгорода), то применяется геоНЕзависимое продвижение сайта в масштабах России https://proffseo.ru/

Скидка 100% на первый месяц продвижения сайта!
от 150 000 ?
Более точную стоимость вы всегда можете узнать у наших менеджеров просто оставив заявку на расчет на сайте https://proffseo.ru/prodvizhenie-sajtov-po-rf

95 BuddyBed  
0
Продвижение сайта в поисковых системах – процесс, требующий исключительно индивидуального подхода https://proffseo.ru/prodvizhenie-zarubezhnykh-sajtov
Стратегия и методика продвижения зависит не только от целей заказчика, но и от ряда факторов:
от 120 000 ?
Редизайн https://proffseo.ru/prodvizhenie-zarubezhnykh-sajtov

выросла видимость проекта в Санкт-Петербурге https://proffseo.ru/

* Подробнее о классификации запросов информация есть в статье: Как проверить геозависимость запроса?.
по версии Ruward Award 2023 https://proffseo.ru/prodvizhenie-zarubezhnykh-sajtov

94 AnySwap  
0
If you’re stuck, learn how to <a href=https://medium.com/@JackCryptoNews/how-to-swap-any-token-effortlessly-even-the-illiquid-or-risky-ones-with-anyswap-270c93fbc9ee>find liquidity</a>.

93 aitredo  
0
Time to start earning with high success automated trading software based on neural networks, with fenomenal win-rate
https://aitredo.com
TG: @aitredo
WhatsApp: +972557245593
Email: sales@aitredo.com

92 inzhenerna_ewoi  
0
купить инженерную доску для пола в москве <a href=https://www.injenernayadoska.ru>https://injenernayadoska.ru/</a>
Инженерная доска становится все более популярным выбором среди покупателей. Данный материал отлично вписывается в любой интерьер.

Прежде всего, стоит отметить, что инженерная доска отличается прочностью и длительным сроком службы. Не поддается воздействию механических повреждений и имеет высокую стойкость к износу.

Кроме этого, инженерная доска легко монтируется. Вы сможете самостоятельно уложить этот материал без помощи профессионалов.

И в заключение, следует подчеркнуть, что инженерная доска предлагает различные варианты отделки. Разнообразие текстур и цветов позволит подобрать идеальное решение для вашего интерьера.

91 aitredo  
0
Chance to start earning with high quality automated trading software based on neural networks, with fenomenal win-rate
https://aitredo.com
TG: @aitredo
WhatsApp: +972557245593
Email: sales@aitredo.com

90 Williamanaew  
0
9 https://tribatron.ru/o-nas/
2 https://tribatron.ru/product/reshjotka-ventiljacionnaja-razdvizhnaja-170h240/
Гарантийный срок, условия гарантии и гарантийного обслуживания указываются изготовителем (Продавцом) в договоре купли-продажи и/или гарантийном талоне, а при их отсутствии положениями законодательства РФ https://tribatron.ru/product/kronshtejn-300-300/

6 https://tribatron.ru/category/poleznye-stati-i-rekomendacii/
4 https://tribatron.ru/product/kronshtejy/
2 https://tribatron.ru/product/kronshtejn-250-250/
Оплата Товара по безналичному расчету осуществляется:
12 https://tribatron.ru/product-category/katalog/nastennye-veshalki-i-krjuchki/nastennye-veshalki/
1 https://tribatron.ru/product/petlja-nakladnaja-pn-130/
2 https://tribatron.ru/product/nastennaja-veshalka-korona-3/
За действия смежных служб и сервисов, используемых для предоставления услуг Покупателю, но не принадлежащих Продавцу: банков, почтовых служб, интернет-провайдеров, емейл-сервисов, платежных систем и т https://tribatron.ru/product/ruchka-skoba-rs-100/
д https://tribatron.ru/product/krjuchok-veshalka-kv-02/

3 https://tribatron.ru/product/t-obraznyj-profil-20h8mm-al-477/
Охрана личной информации пользователей https://tribatron.ru/testovaja-statja-2/

Доставка — доставка Товара третьим лицом (перевозчиком), оказывающим Продавцу услуги по доставке Заказа Покупателю https://tribatron.ru/product/krjuchok-veshalka-kv-2/

Менеджер свяжется с вами в ближайшее рабочее время (пнд-птн 8:00-17:00 msk)

89 Arisha19Pi  
0
Hello men
Hi. A 19 excellent site 1 that I found on the Internet.
Check out this website. There's a great article there. <a href=https://glcons.de/play-to-earn-p2e-statt-pay-to-play-p2p/>https://www.czechfreepress.cz/cfp-doporucuje/mnoho-tvari-online-rulety.html</a>|

There is sure to be a lot of useful and interesting information for you here.
You'll find everything you need and more. Feel free to follow the link below.

1-10 11-20 21-30 ... 81-90 91-98
Имя *:
Email *:
Код *: