問題タブ [formatmessage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
event-log - EventMessageFile なしで Windows イベント ログを読み取る方法は?
Windows イベント ログを読み取るコードがあります。OpenEventLog、ReadEventLog を使用して、イベント ソースとイベント ID を取得します。次に、以下のソースを検索します。
キーを使用して、リストされている内容に従って適切な DLL をロードしEventMessageFile
、最後に を使用FormatMessage
してイベント文字列をメッセージ DLL コンテンツとマージし、最終的なイベント メッセージ テキストを取得します。これは推奨される方法であり、少し面倒ですが、うまく機能します。
まで...ソースを調べてみると、EventMessageFile
ではなく、ProvideGuid
エントリがあることがわかりました。これは新しい方法のようです (Vista と Windows 2008 で表示されます)。うーん -- メッセージ テキストを検索し、データ文字列をマージするために FormatMessage に渡すものは何もありません
:(
レジストリで GUID を検索すると、他のファイル (HTTP ソースの場合は http.sys) への参照につながりますが、完全なメッセージ テキストを取得することはできません。EvtOpenSession
これらのAPIを使用する必要がありますか? EVENTLOGRECORD*
への呼び出しからReadEventLog
、およびサポートされていない Windows 2003 でソフトウェアを実行する必要があるという事実EvtOpenSession
(Vista および Windows 2008 でのみ使用可能) があるので、そうしないことを望んでいます。注: Vista の一部のソースには ProviderGUID があり、その他のソースには EventMessageFile があるため、古い方法も引き続き実行できます。
したがって、私が求めているのは、ProviderGuid を見て、完全なイベント ログ メッセージ テキストを表示するために FormatMessage に渡す必要がある DLL を取得する方法です。
ご意見ありがとうございます
c++ - Windows FormatMessage の安全で柔軟なファサード
プロジェクトにFormatMessage()を使用する必要がありますが、その恐ろしいインターフェイスが好きではありません。置換パラメーターを許可しながら、それを整理するファサードを知っている人はいますか?
私は FastFormat の紹介 の 2 番目の部分を読み、 FormatMessage()の拡張機能を作成することを検討しています(または、FastFormatプロジェクト チームに拡張機能があるかどうかを尋ねます)。他にまともなものがあれば、代わりにそれをつかむでしょう。
私が欲しいのは、次のようなコードを記述できるようにすることです。
結果は次のようになります。
私が構築した現在のラッパーには、次のインターフェースがあります。
これには 2 つの問題があります。
int
,std::string
,void*
- ではない任意の型を簡単に渡すことができるため、型安全ではありません。const char*
- 引数の数と、エラーを表すフォーマット文字列に必要な数が一致しないのは簡単です。
型安全性の観点からFastFormatの機能を考えると、そのメカニズムに従ってFormatMessage()を処理する方法があるかどうかを知りたいです。
c - FormatMessage() が WinINet エラーのメッセージを見つけられないのはなぜですか?
FormatMessageをテストするためにこれを実行しています:
ただし、返されるときにlpMsgBuf
NULL が含まれています... ERROR_INTERNET_DISCONNECTEDのようなものを期待していました。
何かおかしくないですか?ありがとう。
windows - イベントIDがイベントビューアに表示されているものと一致しません
システムイベントログには、次の詳細が記載されたイベントがあります。
EVENTLOGRECORDのEventIDフィールドにも1があるため、イベントログビューアに表示される内容と一致します。
ここまでは順調ですね。
問題は、このソースがメッセージを取得する場所であるadvapi32.dllを見ると、次のように表示されることです。
イベントログビューアは、正しい文字列を見つけるためにIDにこれらの余分なビットを追加することを魔法のようにどのように知っていますか?すべてのイベント文字列にその上位ビットがあるわけではなく、他の上位ビットが設定されているものもあります。
1でFormatMessageを呼び出すと失敗します。x01000001で呼び出すと成功します。しかし、それはイベントログレコードに含まれているものではありません... :(
私が見つけることができるドキュメントはこれについてまったく説明していません(エラー/重大度/機能/コードビットを示すID形式を説明しているドキュメントを除く)。
visual-c++ - EventLog を読み込もうとしているときに FormatMessage がエラー 317 を受け取る
私はこれとほぼ同様の問題を抱えていました。 FormatMessage がエラー コード 317 で失敗する
違いは、これが原因であると言われていますが"FORMAT_MESSAGE_FROM_SYSTEM"
、削除すると再び発生します。
EventLog
Windows Server 2003から読み込もうとしていますが、FormatMessage
関数を使用しようとすると317
エラーが発生します。
興味深いことに、同じコードが Windows Server 2008 でも機能しますFormatMessage
。
私のコード:
こんばんは..
c++ - このエラーを修正: GetLastError 0x13d
このサンプルでは、dwerror は. ですが10045L
、このコードは 0x13d 値をエラーとして返します。フォーマットメッセージを取得するにはどうすればよいですか?ぜひご覧ください。
c++ - Windows/C++: GetExceptionCode() を使用した FormatMessage() は FORMAT_MESSAGE_IGNORE_INSERTS を無視します
次のようなコードを使用して、ゼロ除算、アクセス違反などを報告したいと考えています。私の問題は、 flag を設定しているにもかかわらずFORMAT_MESSAGE_IGNORE_INSERTS
、挿入の位置でメッセージが切り捨てられることです。
上記のコード"The instruction at 0x"
はデバッグ出力に生成されますが、これはあまり役に立ちません。
私は何か間違ったことをしていますか?
c++ - FormatMessage が ERROR_SYSTEM_PROCESS_TERMINATED および ERROR_UNHANDLED_EXCEPTION システム エラーの部分的なメッセージしか作成しないのはなぜですか?
Windows API 内で FormatMessage 関数を使用して、システム エラー コードからメッセージ文字列を生成しています。一部のエラー コードでは、完全なメッセージが作成されていないように見えることに気付きました。
例として、次のサンプル プログラムを取り上げます。
MSDNによると、次のように表示されます。
{致命的なシステム エラー}
%hs システム プロセスは、ステータス 0x%08x (0x%08x 0x%08x) で予期せず終了しました。システムがシャットダウンされました。
ただし、サンプル プログラムでは次のように表示されます。
{致命的なシステム エラー}
%hs システム プロセスは、ステータス 0x で予期せず終了しました
ERROR_UNHANDLED_EXCEPTION
完全なメッセージも作成されないことに気付きました (MSDN のリストと比較した場合)。予想される両方のメッセージには0x%08プレースホルダーが含まれていますが、メッセージは0xの後で終了します。
私が見る限り、他のエラー メッセージは MSDN のリストと一致しているようです (つまり、問題は と に限定されているようERROR_UNHANDLED_EXCEPTION
ですERROR_SYSTEM_PROCESS_TERMINATED
)。
engf-010 の功績 - Visual Studio でエラー ルックアップ ツール ([ツール] - [エラー ルックアップ]) を使用すると、同じ結果が得られます。エラー コードは 574 と 591 です。
これらのメッセージが切り取られている理由を誰か知っていますか?
とにかく完全なメッセージを取得する方法はありますか?