Post by SebcioWitam !
Piszę aplikację usługi i napotkałem na pewien problem dotyczący
logowania pracy usługi, przy użyciu LogMessage(). Otóż wszystko działa
pięknie, tyle że rejestrowanie w dzienniku zdarzenia zawierają na
"Nie można odnaleźć opisu dla identyfikatora zdarzenia 0 ze źródła
MyService. Albo składnik wywołujący to zdarzenie nie jest zainstalowany
na komputerze lokalnym, albo instalacja jest uszkodzona. Możesz
zainstalować lub naprawić składnik na komputerze."
Co zrobić aby powyższa informacja nie była wyświetlana w podglądzie
zdarzeń ?
Najpierw musisz przygotować specjalny plik zasobów zawierający
informacje o rodzajach monitorowanych komunikatów. W tym celu
przygotowujesz prosty plik tekstowy i kompilujesz go specjalnym
kompilatorem (można go pobrać za darmo z Microsoft). Dokładniejszy opis
masz na stronie http://tiny.pl/p6dt (Message Compiler) oraz na stronie
http://tiny.pl/p6d7 (MESSAGETABLE Resource).
Krok po kroku:
~~~~~~~~~~~~~~
Jeżeli plik źródłowy dla tego kompilatora jest w pliku Komunikaty.mc to
najpierw kompilujesz go tym kompilatorem pobranym z powyższych stron:
mc -U Komunikaty.mc
W wyniku kompilacji powstaną pliki z rozszerzeniami .bin, .h oraz .rc.
Następie kompilujesz te pliki do pliku z rozszerzeniem .res przy
poleceniem:
brcc32 -fo Komunikaty.res -m Komunikaty.rc
Program "brcc32" jest w Delphi w folderze "Bin" (w Delphi7; w innych
chyba tak samo).
Wygenerowany plik .res dołączasz do kodu swojej usługi dopisując w pliku
.dpr następujący tekst:
{$R Komunikaty.res }
Na koniec definiujesz w kodzie usługi odpowiednie stałe. W tym celu
otwierasz plik .h (wygenerowany przez kompilator MC). Są tam instrukcje
#define. Identyczne stałe musisz zdefiniować w swoim kodzie. Stałych
tych używasz jako ostatni parametr metody "LogMessage".
Przykład:
~~~~~~~~~
Plik Komunikaty.mc
------------------
LanguageNames = (Polish = 0x415:MSG00415)
;// Informacja
MessageId = 1
SymbolicName = MSG_INFORMATION
Severity = Informational
Facility = Application
Language = Polish
%1
.
;// Ostrzeżenie
MessageId = 2
SymbolicName = MSG_WARNING
Severity = Warning
Facility = Application
Language = Polish
Uwaga! %1
.
;// Błąd
MessageId = 3
SymbolicName = MSG_ERROR
Severity = Error
Facility = Application
Language = Polish
.
Uwaga! Te kropki na końcu każdej definicji są częścią tych definicji.
Kompilator MC utworzy pliki MSG00415.bin, Komunikaty.rc oraz
Komunikaty.h. Plik Komunikaty.h będzie zawierać między innymi
następujące definicje:
// MessageId: MSG_INFORMATION
//
// MessageText:
//
// %1
//
#define MSG_INFORMATION 0x40000001L
// Ostrzeżenie
//
// MessageId: MSG_WARNING
//
// MessageText:
//
// Uwaga! %1
//
#define MSG_WARNING 0x80000002L
// Błąd
//
// MessageId: MSG_ERROR
//
// MessageText:
//
// >>> BŁĄD: %1
//
#define MSG_ERROR 0xC0000003L
Można te definicje w kodzie swojej usługi zapisać na przykład tak:
const
MSG_INFORMATION = Integer($40000001);
MSG_WARNING = Integer($80000002);
MSG_ERROR = Integer($C0000003);
Następnie rejestrujemy swoje zdarzenia w systemowym dzienniku zdarzeń:
// Błąd:
LogMessage(sError, EVENTLOG_ERROR_TYPE, 0, MSG_ERROR);
// Infomacja:
LogMessage(sInfo, EVENTLOG_INFORMATION_TYPE, 0, MSG_INFORMATION);
// Ostrzeżenie:
LogMessage(sWarn, EVENTLOG_WARNING_TYPE, 0, MSG_WARNING);
Wszystko co opisałem wyżej jest wynikiem szukania w Internecie.
Zastosowałem to w jeden swojej usłudze. Zadziałało.
--
Pozdrawiam,
Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------