¿Dónde puedo encontrar un buen ejemplo de uso de la función de reportaje?

StackOverflow https://stackoverflow.com/questions/1290782

  •  18-09-2019
  •  | 
  •  

Pregunta

Como con la mayoría de las páginas de MSDN "Legacy", la página para Reportero Tiene muy poca información para que tenga mucho sentido. He intentado buscar, pero no puedo encontrar un ejemplo bueno, limpio y simple del uso de la función. ¿Alguien podría sugerir uno?

¿Fue útil?

Solución

Terminé usando esto:

HANDLE eventLog;
WORD type;
const char* msg;

// ... snip ...

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

Parece funcionar lo suficientemente bien.

Otros consejos

Bueno, este parece ser un hilo muy antiguo, aterrizó aquí buscando un buen ejemplo de evento de informe ... pero descubrió que no ha recibido ninguna respuesta ... y probablemente ya hubiera encontrado la solución.

La razón por la que ve "ID de evento no encontrada" es porque el EventViewer no puede cargar/buscar el recurso de texto que se mostrará para la ID de evento. Lo siento si la última línea sonaba geek ... pero esto es lo que entiendo de EventLog:

-EventLogging tiene dos aspectos

  1. Registrarse en eventLog (o en otros términos creando eventsurce)
  2. Registro o escritura en el registro de eventos
  3. Ver o leer desde el registro

Cuando se registra en el registro de eventos, simplemente especifica un EventSource (cualquier nombre que identifique ese registro) + eventMessageFile, archivo de categoría y admiteDeventTypes. Aquí eventMessageFile señala un DLL/EXE que contiene sus descripciones/recursos de sus mensajes.

Cuando registra un evento, simplemente lo registre con algunos datos como EventID, Category ID y EventData. Pero cuando lo ve con cualquier EventViewer (o Windows eventvwr.exe), el espectador lee sus eventos, busca una DLL/EXE asociada con su EventSource (señalado por EventMessageFile) y representa la descripción de la sección de recursos de ese DLL/EXE .

Esta DLL no es más que un archivo de recursos simple que se compiló usando MessageCompiler, y contiene un "Messagetable". Esto se hace para proporcionar la registro de eventos específicos de la cultura

Esta es la razón, cuando exporta el registro en XML/TXT, etc. desde su Viewer de eventos, le pregunta si desea guardarlo "con Display Informaion" o "Sin información de visualización", para que pueda verlo en las computadoras que lo hacen. no tener eventMessageFile.

Jfyi La entrada de reg se encuentra en:

HKLM\CurrentControlSet\System\Services\EventLog\Application

Una trampa: si se pregunta cómo lo hace .net ..., simplemente lo hace proporcionando un EventMessageFile predeterminado llamado eventLogMessage.dll (que se encuentra en %SYSTEMROOT%\Microsoft.Net\Framework\vXXXX\)

Como recuerdo, es un dolor configurar correctamente: debe agregar mensajes a su aplicación utilizando la Compilador de mensajes - Si omite esto, no verá códigos de error de mensajes útiles. Echa un vistazo a Creación de un servicio de Windows NT utilizando ATL para un ejemplo

El servicio de Windows de muestra C ++ es un servicio de Windows que informa al registro de eventos, puede obtener el código desde https://code.msdn.microsoft.com/windowsapps/cppwindowsservice-cacf4948En particular, la siguiente función (citada desde ServiceBase.cpp) lo hace

//
//   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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top