Windows:ReportEvent関数
-
28-10-2019 - |
質問
私が理解した限り、 ReportEvent 関数が必要です メッセージテキストファイル 適切にフォーマットされたメッセージを受信するためにレジストリを通じて関連付けられます。メッセージテキストファイルが関連付けられていないイベントを報告する簡単なイベントIDや簡単な方法はありますか?
または、アプリケーションで使用できる特別な共通イベントソースはありますか? RegisterEventSource(null、 "アプリケーション")のようなもの?
解決
いいえ、ルールに従い、メッセージテキストファイルを定義し、リソースにビルドし、アプリなどにリンクする必要があります。
MSDNで提供された例 あなたがする必要があるすべてを通してあなたを導きます。
他のヒント
これを試してみてください、それは以前に私のために働いていました。
あなたはそうしない 持ってる HKLMでメッセージを登録します。 (これはあなたが良いことだからです できません 管理者でない場合はメッセージを登録します)。
しかし、それはあなたがWindowsアプリケーションイベントログにイベントを書くことを妨げるものではありません。唯一の欠点は、Windows Vistaから始めて、それと一緒に醜いテキストを取得することです。
HRESULT LogToEventLog(String Source, String EventText, int EventType, DWORD EventID)
{
/*
EventType is one of:
EVENTLOG_ERROR_TYPE = $0001;
EVENTLOG_WARNING_TYPE = $0002;
EVENTLOG_INFORMATION_TYPE = $0004;
EVENTLOG_AUDIT_SUCCESS = $0008;
EVENTLOG_AUDIT_FAILURE = $0010;
Source is your name for your app or feature, e.g.:
"My Cool App"
"Outlook"
"ESENT"
"Chrome"
*/
HANDLE h = RegisterEventSource(null, Source); //null --> local computer
if (h == 0)
return HResultFromWin32(GetLastError);
try
{
PChar[1] ss;
ss[0] = PChar(EventText);
if (!ReportEvent(
h, // event log handle
EventType, // event type
0, // category zero
EventID, // event identifier
null, // no user security identifier
1, // one substitution string
0, // no data
@ss, // pointer to string array
null // pointer to data
))
{
return HResultFromWin32(GetLastError);
}
}
finally
{
DeregisterEventSource(h);
}
return S_OK;
}
そして、今、あなたはアプリケーションイベントログにイベントを記録することができます:
LogToEventLog("Stackoverflow", "Question 5399066 was answered by Ian Boyd",
EVENTLOG_INFORMATION_TYPE, 0x45);
他の誰かの登録を盗みます
残念ながら、Windows Vistaから始めて、Windowsは事前にイベントを登録しなかったというugい苦情になります。
Source StackOverFlowからのイベントID 69の説明は見つかりません。このイベントを提起するコンポーネントがローカルコンピューターにインストールされていないか、インストールが破損しています。ローカルコンピューターのコンポーネントをインストールまたは修復できます。
イベントが別のコンピューターで発生した場合、イベントで表示情報を保存する必要がありました。
次の情報がイベントに含まれていました。
質問5399066はイアン・ボイドによって答えられました
しかし、あなたはしません 持ってる それと一緒に暮らす。 HKLMでメッセージソースファイルを登録しなかったからといって、他の誰もいなかったわけではありません。
たとえば、からのメッセージに注意してください 見通し イベントログのソース:
- ソース:
Outlook
- eventid:
0x40000020
- イベントデータ:
D:\win32app\Exchange\Outlook2003.pst
- メッセージ:
The store D:\win32app\Exchange\Outlook2003.pst has detected a catalog checkpoint.
登録情報を確認できます 見通し の:
hkey_local_machine system currentControlset services eventlog application Outlook
そして、参照してください:
MessageEventFile: REG_SZ = "D:\Programs\MICROS~4\Office14\1033\MAPIR.DLL"
mapir.dllバイナリのリソースを覗いてみると、 メッセージテーブル:
1 MESSAGETABLE
{
0x12, "Connection stats for server (%1). Rpcs Attempted (%2), Rpcs Succeeded (%3), Rpcs Failed (%4), Rpcs Canceled (%5), Rpc UI shown (%6), Avg request time (%7) ms, Min request time (%8) ms, Max request time (%9) ms.\r\n"
0x14, "Cancelable RPC started.\r\n"
0x15, "Cancelable RPC shutdown.\r\n"
0x40000010, "Cancelable RPC dialog shown for server (%1), total wait time was (%2) ms, result was (%3).\r\n"
0x40000011, "User canceled request against server (%1) after waiting (%2) ms.\r\n"
0x40000013, "Rpc call (%1) on transport (%2) to server (%3) failed with error code (%4) after waiting (%5) ms; eeInfo (%6).\r\n"
0x40000016, "There was a problem reading one or more of your reminders. Some reminders may not appear.\r\n"
0x40000017, "Unable to update public free/busy data.\r\n"
0x4000001A, "%1\r\n"
0x4000001B, "%1\r\n"
0x4000001D, "The store %1 is being re-pushed to the indexer for the following reason: %2.\r\n"
0x4000001E, "Starting reconciliation for the store %1 for the following reason: %2.\r\n"
0x4000001F, "The store %1 has detected a catalog rebuild.\r\n"
0x40000020, "The store %1 has detected a catalog checkpoint.\r\n"
...
}
EventID 0x40000020がフォーマット文字列に関連していることがわかります。
「ストア%1がカタログチェックポイントを検出しました。 r n」
Outlookの登録をハイジャックできます。
LogToEventLog("Outlook", "Your mom", EVENTLOG_INFORMATION_TYPE, $40000020);
そして、すべての醜い警告なしにイベントログにイベントを追加します: