Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 在哪里可以找到ReportEvent函数用法的好例子?_Winapi_Advapi32 - Fatal编程技术网

Winapi 在哪里可以找到ReportEvent函数用法的好例子?

Winapi 在哪里可以找到ReportEvent函数用法的好例子?,winapi,advapi32,Winapi,Advapi32,与大多数“遗留”MSDN页面一样,的页面信息太少,我无法理解。我尝试过搜索,但找不到一个好的、干净的、简单的函数用法示例。有人能推荐一个吗?我记得正确设置是一件痛苦的事情-您需要使用向应用程序添加消息-如果跳过此操作,您将不会看到有用的消息,只会看到错误代码。请看一个例子我最终使用了以下方法: HANDLE eventLog; WORD type; const char* msg; // ... snip ... ReportEvent(eventLog, type, 0, 1, NULL,

与大多数“遗留”MSDN页面一样,的页面信息太少,我无法理解。我尝试过搜索,但找不到一个好的、干净的、简单的函数用法示例。有人能推荐一个吗?

我记得正确设置是一件痛苦的事情-您需要使用向应用程序添加消息-如果跳过此操作,您将不会看到有用的消息,只会看到错误代码。请看一个例子

我最终使用了以下方法:

HANDLE eventLog;
WORD type;
const char* msg;

// ... snip ...

ReportEvent(eventLog, type, 0, 1, NULL, 1, 0, &LPCTSTR(msg), NULL);

似乎工作得很好。

这似乎是一个非常古老的线程,在这里登陆是为了寻找一个报告事件的好例子。。。但我发现你还没有收到任何回复…而且可能已经找到了解决方案

您看到“未找到事件Id”的原因是EventViewer无法加载/查找要为事件Id显示的文本资源。很抱歉,如果最后一行听起来很怪。。但这就是我对EventLog的理解:

-事件日志记录有两个方面

  • 向EventLog注册(或以其他方式创建EventSource)
  • 记录或写入事件日志
  • 查看或读取日志
  • 在事件日志中注册时,只需指定事件源(标识该日志的任何名称)+EventMessageFile、Category File和SupportedEventTypes。此处EventMessageFile指向包含消息描述/资源的DLL/EXE

    记录事件时,只需使用一些数据(如EventID、Category ID和EventData)进行记录。但是,当您使用任何EventViewer(或Windows eventVwr.exe)查看它时,查看器会读取您的事件,查找与您的eventSource(由EventMessageFile指向)关联的DLL/exe,并从该DLL/exe的资源部分呈现说明

    这个DLL只是一个简单的资源文件,它是使用MessageCompiler编译的,并且包含一个“MessageTable”。这样做是为了提供特定于区域性的事件日志记录

    这就是原因,当您从EventViewer将日志导出到XML/TXT等格式时,它会询问您是否要保存它“带显示信息”或“不带显示信息”,以便您可以在没有EventMessageFile的计算机上查看它

    JFYI注册条目位于:

    HKLM\CurrentControlSet\System\Services\EventLog\Application
    

    一个catch:如果你想知道.NET是怎么做的……它只是提供了一个默认的EnvivMeLogEFEFLE,叫做EnviLogLogMase.DLL(在%StROCRONTRO% \\\NET\\Frase\VxXXX \/Cord>)下找到.<样本> Windows >服务> C++,它是一个Windows服务报告事件日志,你可以从中获取代码 特别是,下面的函数(引用自ServiceBase.cpp)实现了这一点


    此解决方案的问题在于,它会记录混乱的日志(参见Windows Vista上的“找不到源XYZ.exe中事件ID 1的说明”)。如果不需要特定于语言/区域性的消息,则可以生成一个消息DLL,该DLL只包含一个映射到资源“%1”的ID(例如,通用_消息)。然后为应用程序注册此DLL,只需将要在事件查看器中显示的字符串作为此消息的第一个参数传递。此方法在中进行了描述,但请注意在调用“mc”使示例工作时使用“-c”标志!
    //
    //   FUNCTION: CServiceBase::WriteEventLogEntry(PWSTR, WORD)
    //
    //   PURPOSE: Log a message to the Application event log.
    //
    //   PARAMETERS:
    //   * pszMessage - string message to be logged.
    //   * wType - the type of event to be logged. The parameter can be one of 
    //     the following values.
    //
    //     EVENTLOG_SUCCESS
    //     EVENTLOG_AUDIT_FAILURE
    //     EVENTLOG_AUDIT_SUCCESS
    //     EVENTLOG_ERROR_TYPE
    //     EVENTLOG_INFORMATION_TYPE
    //     EVENTLOG_WARNING_TYPE
    //
    void CServiceBase::WriteEventLogEntry(PWSTR pszMessage, WORD wType)
    {
        HANDLE hEventSource = NULL;
        LPCWSTR lpszStrings[2] = { NULL, NULL };
    
        hEventSource = RegisterEventSource(NULL, m_name);
        if (hEventSource)
        {
            lpszStrings[0] = m_name;
            lpszStrings[1] = pszMessage;
    
            ReportEvent(hEventSource,  // Event log handle
                wType,                 // Event type
                0,                     // Event category
                0,                     // Event identifier
                NULL,                  // No security identifier
                2,                     // Size of lpszStrings array
                0,                     // No binary data
                lpszStrings,           // Array of strings
                NULL                   // No binary data
                );
    
            DeregisterEventSource(hEventSource);
        }
    }