C#でイベントビューアに新しいイベントを追加する方法の例が見つかりました。 しかし、 "Application"の下のイベントビューアに新しいイベントを作成するC++(.NETではなく)で書かれたサンプルが必要です。イベントビューアにイベントを書き込む
答えて
あなたはWINAPIからこれらの3つの機能を使用することができます。ここでは
は、これらを使用すると、メッセージを正しく表示する方法の簡単な例でありますイベントログに記録されます(簡略化のためにエラー処理はほとんど無視されます)。
次Event_log.mc
ファイルからのメッセージ情報をcontaingリソースを作成します:
mc.exe -A -b -c -h . -r resources Event_log.mc
rc.exe -foresources/Event_log.res resources/Event_log.rc
これは、ヘッダファイルを作成します。
;#ifndef _EXAMPLE_EVENT_LOG_MESSAGE_FILE_H_
;#define _EXAMPLE_EVENT_LOG_MESSAGE_FILE_H_
MessageIdTypeDef=DWORD
SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
Warning=0x2:STATUS_SEVERITY_WARNING
Error=0x3:STATUS_SEVERITY_ERROR
)
LanguageNames=(EnglishUS=0x401:MSG00401
Dutch=0x113:MSG00113
Neutral=0x0000:MSG00000
)
MessageId=0x0 SymbolicName=MSG_INFO_1
Severity=Informational
Facility=Application
Language=Neutral
%1
.
MessageId=0x1 SymbolicName=MSG_WARNING_1
Severity=Warning
Facility=Application
Language=Neutral
%1
.
MessageId=0x2 SymbolicName=MSG_ERROR_1
Severity=Error
Facility=Application
Language=Neutral
%1
.
MessageId=0x3 SymbolicName=MSG_SUCCESS_1
Severity=Success
Facility=Application
Language=Neutral
%1
.
;#endif
は.mc
ファイルと.res
リソースファイルを作成するには、私は次のことを実行します現在のディレクトリにEvent_log.h
と呼ばれ、ディレクトリには、アプリケーションにリンクする必要があるEvent_log.res
というファイルが含まれていますバイナリ。
例main.cpp
:
#include <windows.h>
#include "Event_log.h"
void install_event_log_source(const std::string& a_name)
{
const std::string key_path("SYSTEM\\CurrentControlSet\\Services\\"
"EventLog\\Application\\" + a_name);
HKEY key;
DWORD last_error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
key_path.c_str(),
0,
0,
REG_OPTION_NON_VOLATILE,
KEY_SET_VALUE,
0,
&key,
0);
if (ERROR_SUCCESS == last_error)
{
BYTE exe_path[] = "C:\\path\\to\\your\\application.exe";
DWORD last_error;
const DWORD types_supported = EVENTLOG_ERROR_TYPE |
EVENTLOG_WARNING_TYPE |
EVENTLOG_INFORMATION_TYPE;
last_error = RegSetValueEx(key,
"EventMessageFile",
0,
REG_SZ,
exe_path,
sizeof(exe_path));
if (ERROR_SUCCESS == last_error)
{
last_error = RegSetValueEx(key,
"TypesSupported",
0,
REG_DWORD,
(LPBYTE) &types_supported,
sizeof(types_supported));
}
if (ERROR_SUCCESS != last_error)
{
std::cerr << "Failed to install source values: "
<< last_error << "\n";
}
RegCloseKey(key);
}
else
{
std::cerr << "Failed to install source: " << last_error << "\n";
}
}
void log_event_log_message(const std::string& a_msg,
const WORD a_type,
const std::string& a_name)
{
DWORD event_id;
switch (a_type)
{
case EVENTLOG_ERROR_TYPE:
event_id = MSG_ERROR_1;
break;
case EVENTLOG_WARNING_TYPE:
event_id = MSG_WARNING_1;
break;
case EVENTLOG_INFORMATION_TYPE:
event_id = MSG_INFO_1;
break;
default:
std::cerr << "Unrecognised type: " << a_type << "\n";
event_id = MSG_INFO_1;
break;
}
HANDLE h_event_log = RegisterEventSource(0, a_name.c_str());
if (0 == h_event_log)
{
std::cerr << "Failed open source '" << a_name << "': " <<
GetLastError() << "\n";
}
else
{
LPCTSTR message = a_msg.c_str();
if (FALSE == ReportEvent(h_event_log,
a_type,
0,
event_id,
0,
1,
0,
&message,
0))
{
std::cerr << "Failed to write message: " <<
GetLastError() << "\n";
}
DeregisterEventSource(h_event_log);
}
}
void uninstall_event_log_source(const std::string& a_name)
{
const std::string key_path("SYSTEM\\CurrentControlSet\\Services\\"
"EventLog\\Application\\" + a_name);
DWORD last_error = RegDeleteKey(HKEY_LOCAL_MACHINE,
key_path.c_str());
if (ERROR_SUCCESS != last_error)
{
std::cerr << "Failed to uninstall source: " << last_error << "\n";
}
}
int main(int a_argc, char** a_argv)
{
const std::string event_log_source_name("my-test-event-log-source");
install_event_log_source(event_log_source_name);
log_event_log_message("hello, information",
EVENTLOG_INFORMATION_TYPE,
event_log_source_name);
log_event_log_message("hello, error",
EVENTLOG_ERROR_TYPE,
event_log_source_name);
log_event_log_message("hello, warning",
EVENTLOG_WARNING_TYPE,
event_log_source_name);
// Uninstall when your application is being uninstalled.
//uninstall_event_log_source(event_log_source_name);
return 0;
}
希望これはしかし@Codyグレーで述べたように、このアプローチは廃止されたことを考えることができます。
Windows Event Log APIのドキュメントをお探しの場合は、アンマネージC++で記述しているので、.NET Frameworkのラッパーを使用するのではなく、ネイティブのWin32 API関数を呼び出す必要があります。
Windows Vista(XP、Server 2003など)より前のオペレーティングシステムをターゲットにしている場合は、代わりに古いEvent Logging APIを使用する必要があります。
こんにちは、マイクロソフトに添付したリンクを使用しましたが、良い例があります。しかし、説明を変更するオプションはなく、「イベントビューア」に移動して説明を開くと、次のような行が見つかりました。「ソース(MyEventProvider)のイベントID(259)の説明が見つかりません。ローカルコンピュータに、リモートコンピュータからのメッセージを表示するために必要なレジストリ情報またはメッセージDLLファイルがない場合があります。/ AUXSOURCE =フラグを使用してこの説明を取得できる場合があります。詳細については、ヘルプとサポートを参照してください。イベント: " – Moti
- 1. 書き込みキャッシュポリシーに書き込み/フェッチを書き込む
- 2. ZKのdivにonScrollイベントを書き込む
- 3. 相関処理イベントをAppFabricに書き込む
- 4. jqgridのColModelでハイパーリンクのonclickにイベントを書き込む方法
- 5. ng2-smart-tableのソート列イベントにカスタムソートロジックを書き込む方法
- 6. OnCell変更イベントを次のシートvbaマクロに書き込む
- 7. イベントビューアの作成イベントID C#
- 8. Readerのアプリケーションインスタンスを書き込むときに<*>を書き込む方法
- 9. pyspark csvをデータフレームに書き込むことなくディスクに書き込む
- 10. shockWaveのFlashオブジェクトのイベントを書き込む方法
- 11. Jquery/Javascriptでkeypressイベントを書き込む方法は?
- 12. WebBrowser COMイベントを書き込む際の問題
- 13. クリップボードに書き込む
- 14. ファイルに書き込むpython
- 15. mtdブロックデバイスに書き込む
- 16. sdcardに書き込む
- 17. バイナリファイルに書き込むpython
- 18. Nifi:フローファイルに書き込む
- 19. ファイルに書き込む(Python)
- 20. JQuery - オープナーウィンドウに書き込む
- 21. テキストファイルに書き込む
- 22. C#ソケットに書き込む
- 23. JSONArrayに書き込む
- 24. ElementTree XMLに書き込む
- 25. テキスタイルに書き込む
- 26. ファイルに書き込む(Python)
- 27. Qt:ファイルに書き込む
- 28. スパークカラム - コンソールに書き込む
- 29. cURL - ファイルに書き込む
- 30. linux:FIFOに書き込む
このAPIはWindows Vistaで廃止されました。新しいアプリケーションでは[WindowsイベントログAPI](http://msdn.microsoft.com/en-us/library/windows/desktop/aa385780.aspx)を使用してイベントを記録する必要があります。 –
@CodyGray、ta。決してそれを知らなかった。以前のAPIはまだVistaとWindows 7で問題なく使用しています(私が知る限り)。 – hmjd
こんにちは、私が前に述べたように、説明は一般的な説明を与えています。 "イベントビューア"の説明全体を変更することはできません。 ReportEvent関数を使用しているときに説明を変更できる例を指すことができれば幸いです。 – Moti