2011-12-19 33 views
15

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

17

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.

+3

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. –

+0

@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

+0

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

7

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ế.

+0

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

Các vấn đề liên quan