| Visor de sucesos en Plataformas NT Una de las herramientas que más manejan los administradores de sistemas, en caso de problemas, es el Visor de sucesos, el cual, es más importante su existencia cuando más gente la utiliza, o cuando no tiene interfaz de usuario (Los servicios del sistema, un proceso en segundo plano .....) El Visor de sucesos, se basa en una API del sistema operativo, simplemente usando las funciones ReportEvent, y RegisterEventSource, se pueden añadir nuevas entradas al visor:
Sin embargo, si empleamos esta función, al consultar el visor de sucesos, nos encontramos con que nos da un mensage similar a "No se encuentra la descripción del Id. de suceso ( 0 ) en el origen ( MiPrograma ). Es posible que el equipo local no tenga la información de Registro o archivos DLL de mensajes necesarios para mostrar mensajes desde un equipo remoto. La siguiente información es par". Esto ocurre porque windows emplea la Id del suceso para identificar el error, y esta ID de suceso, tiene que tener un fichero para describirla (Es decir, tendremos que hacer que windows reconozca nuestra aplicación). Para evitar este problema, lo primero que habrá que hacer es crear una entrada en el registro del sistema para que reconozca nuestra aplicación (Y porteriormente la muestre en "Origen" en la ficha de los sucesos). La rama en la que se deberá crear la nueva entrada es en \\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application (NOTA: Se deben tener permisos de administrador para poder escribir aqui). El valor para TypesSupported deberá ser 7.
Como se puede observar en el código previamente expuesto, en la clave EventMessageFile debe ir un fichero que contenga las descripciones de los sucesos, y he empleado la función GetModuleFileName para obtener el nombre del fichero que esta ejecutando la función, de manera que en este caso concreto, quien ejecute esta función, deberá llevar la descripción de los sucesos (hModulo es una variable global, a la que he asignado el HANDLE que nos da windows al arrancar el modulo (Es decir, el primer parametro que recibimos en la función Winmain, o en DllMain). El código nos quedaría asi: Sin embargo, aún nos falta un detalle en esta dll, con la dll, en su estado actual, tenemos nuetra aplicación registrada en windows, pero aún nos queda sin embargo, aún no hemos descritos las distintas ID (Que luego emplearemos para ordenar en el visor de sucesos). Para ello, abriremos el notepad, o algun editor de solo texto, y crearemos una serie de identificadores, con el formato a seguir, de la siguiente manera: ;#ifndef __MESSAGES_H__
MessageId=1 NOTA: Es importante el punto que separa los mensages entre si. NOTA 2: El mensage escrito, sobreescribirá la cadena que hayamos metido en el visor de sucessos, salvo en el último caso. Una vez creado este fichero de texto, debemos incluirno en nuestra dll, para lo que primero incluimos un script de recursos (Al que es aconsejable añadir la versión del fichero). A continuación, abrimos una ventana de MSDOS (Simbolo del sistema), y nos vamos al directorio en el que hayamos guardado el fichero con las descripciones de los archivos. Una vez en el, ejecutamos el comando mc sobre el fichero, el cual creará un fichero .rc, un fichero .h, y un fichero .bin por cada idioma que hayamos definido. Incluimos en nuetro proyecto el fichero.h, editamos con el notepad el fichero .rc que ha creado, y copiamos las líneas en el fichero de recursos de nuetro proyecto (O utilizamos un #include dentro de el fichero de recursos de nuetro proyecto para incluir el fichero de recursos que nos ha generado). Una vez hemos seguido todos estos pasos, compilamos el proyecto, lo que generará una dll, la cual registramos (bien con el regsvr32, o con alguna función como se indicaba en un articulo previo), y al consultar el visor de sucesos, tenemos ya un evento, con todas sus propiedades. |