こんにちは。
Windows XP以降のイベントログの習得についてです。
Delphi: D5,D6,2006 です。
ReadEventLog→ExpandEnvironmentStrings→LoadLibraryEx→FormatMessageの手順で
DLLをリソースとして読み込み文字列を取得しているのですが
正確にメッセージが取得できないものがあるのです。
%1 や %2 といったものは単純に
for i:=StringList.Count-1 downto 0 do StringReplace(msg,'%'+IntToStr(i),StringList[i],[rfReplaceAll])
のようにやって普通に置換しています。
ソースが Microsoft Antimalware のものだけが、
> %%860 の署名のバージョンが更新されました。
> 現在の署名のバージョン 〜以下略
のようになってしまいます。
この %%860 が
PChar(EventLogRec)+EventLogRec^.StringOffset) 以降の
StrLength x NumStrings 番目に現れません。
OS標準のイベントビューアを見ると %%860 は Microsoft Antimalware になっています。
%%860 は、どこから持ってくればよいのかご存じの方がいらっしゃいましたら、ご教示願えればと思い質問させていただきました。
よろしくお願いいたします。
コード的には
http://www.delphipraxis.net/6409-eventloglister-nt-2k-xp-2k3.html
と似たような感じで、特に特別なことをやっているわけでもなく問題なく動きます。
%%nは、イベントID(リソースの方)のようです。
ガセだったら済みません...当方では同様のメッセージが見つからず、確認できませんでしたので。
Querying for Event Information
http://msdn.microsoft.com/en-us/library/bb427356(v=vs.85).aspx
の ApplyParameterStringsToMessage が参考になると思います。
尚、リンク先で使用されているAPI関数のフラグ定数は、XPで使用できないものもあります。
Delphiでは定義されてないと思いますが(XE2でさえも...)、念のため。
細切れコメントで済みません。
ちゃんとした規定がありました(当然ですよね...)。
ParameterMessageFile: Core Services
http://technet.microsoft.com/ja-jp/library/cc737063
回答有り難うございます。
お陰様で取得できました。
フローが LoadLibraryExとFormatMessageがペアで呼び出される仕様になっていたため、書き直しにずいぶんと手間取りそうです。
(効率的に LoadLibraryEx1回で FormatMessageを何度読んでも OK な感じにしなければいけないだろうと・・・)
FormatMessageにイベントIDを与えてメッセージを取得し、結果に %%が現れた場合は、もう一度FormatMessageを呼び出してやらないといけないんですね。
しかも %%860 の部分だけ抽出して FormatMessageに渡してやらないといけないという・・・。
結果も %%860 に対応する Microsoft Antimalware が帰ってくるだけなので
その部分を置換してやる必要が有るようです。
とりあえず、%%に続く数値を取得してその部分を置換する処理を書いて %%がなくなるまでループで回す処理にて実験は成功しました。
今回 %% は先頭にしか現れませんでしたが、途中に出現する場合なども想定するとけっこう書きなおさないといけないようです。
大変助かりました。
ありがとうございました。
もう少し時間かかりそうです。
一応解決したので解決にチェック入れさせて頂きます。
コード書きたかったんですが、ちと文字列の追加削除がバグっぽいので。
ツイート | ![]() |