Tôi đã tìm thấy ví dụ trong C# cách thêm Sự kiện mới vào Trình xem sự kiện. Nhưng, tôi cần một ví dụ được viết bằng C++ (không .NET) để tạo Sự kiện mới cho Trình xem sự kiện trong phần "Ứng dụng".Viết sự kiện cho trình xem sự kiện
Trả lời
Bạn có thể sử dụng ba chức năng từ WINAPI:
Dưới đây là một ví dụ nhanh về cách sử dụng những điều này và để hiển thị các thông điệp một cách chính xác trong bản ghi sự kiện (xử lý lỗi phần lớn bị bỏ qua cho ngắn gọn).
Tạo một tài nguyên có chứa có thông tin nhắn từ Event_log.mc
tập tin sau đây:
;#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
Xây dựng .mc
tập tin và .res
nguồn tập tin tôi thực hiện như sau:
mc.exe -A -b -c -h . -r resources Event_log.mc
rc.exe -foresources/Event_log.res resources/Event_log.rc
này sẽ tạo một tập tin tiêu đề gọi là Event_log.h
trong thư mục hiện tại và thư mục resources
có chứa tệp có tên Event_log.res
mà bạn phải liên kết đến ứng dụng của mình nhị phân.
Ví dụ 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;
}
Hy vọng điều này sẽ giúp nhưng cho rằng cách tiếp cận này đã bị phản đối như đã nêu bởi @Cody Grey.
Bạn đang tìm tài liệu trên Windows Event Log API. Bạn sẽ cần phải gọi các hàm API Win32 riêng, thay vì sử dụng các trình bao bọc của .NET Framework, vì bạn đang viết trong C++ không được quản lý.
Nếu bạn đang nhắm mục tiêu hệ điều hành trước Windows Vista (XP, Server 2003, v.v.), bạn sẽ cần sử dụng số Event Logging API cũ hơn thay thế.
Xin chào, tôi đã sử dụng liên kết bạn đính kèm với Microsoft và có một ví dụ điển hình. Nhưng, Không có tùy chọn để thay đổi Mô tả và khi tôi đi đến "Trình xem sự kiện" và mở mô tả, tôi đã tìm thấy các dòng theo dõi: "Không thể tìm thấy mô tả cho ID sự kiện (259) trong Nguồn (MyEventProvider). máy tính cục bộ có thể không có thông tin đăng ký cần thiết hoặc thông báo các tệp DLL để hiển thị thư từ máy tính từ xa. Bạn có thể sử dụng cờ/AUXSOURCE = để truy xuất mô tả này, xem phần Trợ giúp và Hỗ trợ để biết chi tiết. sự kiện: " – Moti
- 1. C# viết cho trình xem sự kiện
- 2. Trình xem sự kiện Windows và log4net
- 3. Xem sự kiện javascript trong trình duyệt
- 4. Sự kiện Java và trình nghe sự kiện
- 5. Xem nghe sự kiện - Javascript
- 6. Tiêu thụ sự kiện "Truy tìm sự kiện cho Windows"
- 7. Tăng sự kiện Backbone.js Xem
- 8. sự kiện trình duyệt cho window.focus()
- 9. Sự kiện nhấp hoãn sự kiện
- 10. Sự kiện Bubbling cho Sự kiện tùy chỉnh trong WPF?
- 11. Sự kiện cho "DataContextChanging"?
- 12. Sự cố trong sự kiện Đã kiểm tra sự kiện
- 13. C# sự kiện kiểu phụ kiện cho sự kiện CLI trong F #
- 14. Thêm nhiều trình xử lý sự kiện cho một sự kiện trong XAML?
- 15. Lệnh Sourcing Sự kiện vs Sự kiện
- 16. Trình nghe sự kiện NHibernate
- 17. Trình tự sự kiện JavaScript
- 18. Android - trình nghe sự kiện
- 19. Viết/Đọc cho Nhật ký Sự kiện Windows
- 20. Viết cho Nhật ký sự kiện trong Delphi
- 21. Khung sự kiện cho Python?
- 22. Trình phát sự kiện liên tiến trình cho Node.js?
- 23. Backbone.js Xem cú pháp trình chọn sự kiện nhấp chuột?
- 24. Xem tất cả sự kiện dom cho một phần tử
- 25. Nhiều lượt xem OnTouch Sự kiện
- 26. sự kiện Click cho DataGridCheckBoxColumn
- 27. Sự kiện .NET cho quá trình thực thi Quy trình
- 28. Sử dụng trình kiểm tra sự kiện rỗng trong bộ điều khiển sự kiện
- 29. Sự kiện đồng thời dựa trên sự kiện là gì?
- 30. Xác định danh sách các trình xử lý sự kiện được liên kết với sự kiện
Lưu ý rằng API đã không được chấp nhận như của Windows Vista. Các ứng dụng mới nên sử dụng [API bản ghi sự kiện Windows] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385780.aspx) để ghi nhật ký sự kiện. –
@CodyGray, ta. Không bao giờ biết điều đó. API cũ vẫn hoạt động (theo như tôi có thể nói) mặc dù tôi sử dụng nó mà không gặp sự cố nào trên Vista và Windows 7. – hmjd
Xin chào, Như tôi đã đề cập trước đây, mô tả cung cấp mô tả chung và tôi có thể thêm thứ gì đó vào cuối nhưng không thay đổi toàn bộ mô tả trong "Trình xem sự kiện". Tôi sẽ đánh giá cao nếu bạn có thể chỉ ra một ví dụ có thể thay đổi mô tả khi sử dụng chức năng ReportEvent – Moti