delphi windows-services windows-messages

delphi - TService no procesará los mensajes



windows-services windows-messages (3)

¿A qué te refieres cuando dices que "usa" Windows Messaging System? ¿Estás consumiendo o enviando mensajes de Windows?

Si envía un mensaje de Windows, debe asegurarse de hacerlo correctamente. Sugeriría escribir un ciclo de mensajes para garantizar que sus mensajes se envíen correctamente. También sugiero leer sobre loops de mensajes y cómo funcionan.

¿Qué es un bucle de mensaje (haga clic en el título para llevarlo al origen de esta información)?

while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); }

  1. El bucle de mensaje llama a GetMessage (), que se ve en la cola de mensajes. Si la cola de mensajes está vacía, su programa básicamente se detiene y espera uno (Bloquea).
  2. Cuando se produce un evento que provoca que se agregue un mensaje a la cola (por ejemplo, el sistema registra con un clic del mouse) GetMessages () devuelve un valor positivo que indica que hay un mensaje para procesar y que ha rellenado los miembros del MSG estructura que pasamos. Devuelve 0 si golpea WM_QUIT, y un valor negativo si ocurre un error.
  3. Tomamos el mensaje (en la variable Msg) y lo pasamos a TranslateMessage (), esto hace un poco de procesamiento adicional, traduciendo mensajes de clave virtual en mensajes de caracteres. Este paso es realmente opcional, pero ciertas cosas no funcionarán si no está allí.
  4. Una vez hecho esto, pasamos el mensaje a DispatchMessage (). Lo que DispatchMessage () hace es tomar el mensaje, ver para qué ventana está y luego buscar el Procedimiento de Ventana para la ventana. Luego llama a ese procedimiento, enviando como parámetros el control de la ventana, el mensaje y wParam y lParam.
  5. ¡En su procedimiento de ventana, verifica el mensaje y sus parámetros, y hace lo que quiera con ellos! Si no está manejando el mensaje específico, casi siempre llama a DefWindowProc () que realizará las acciones predeterminadas por usted (lo que a menudo significa que no hace nada).
  6. Una vez que haya terminado de procesar el mensaje, su procedimiento de Windows retorna, DispatchMessage () regresa y regresamos al principio del ciclo.

Creé un servicio de Windows que usa Windows Messaging System. Cuando pruebo la aplicación desde el depurador, los mensajes se procesan bien, pero cuando lo instalo, mi mensaje ... se lo pedí hace 14 minutos.

vladimir 1tuga


Gracias a todos por las respuestas, el problema fue el sistema operativo (vista), lo probé con mi Windows 2000 y todo funciona.

gracias por la luz Rob.


Los servicios generalmente no reciben mensajes de ventana. No necesariamente tienen manijas de ventana. Incluso si lo hacen, se ejecutan en un escritorio separado. Los programas no pueden enviar mensajes de un escritorio a otro, por lo que un servicio solo puede recibir mensajes de otro servicio o de un programa iniciado por un servicio.

Antes de Windows Vista, podría haber configurado su servicio para interactuar con el escritorio. Eso hace que el servicio se ejecute en el mismo escritorio que un usuario conectado, por lo que un programa que se ejecute como ese usuario podría enviar mensajes a las ventanas de su servicio. Sin embargo, Windows Vista aísla los servicios; ya no pueden interactuar con el escritorio de ningún usuario.

Hay muchas otras formas de comunicarse con los servicios. Incluyen canalizaciones con nombre, listas de correo, archivos mapeados en memoria, semáforos, eventos y sockets.

Con un socket, por ejemplo, su servicio podría escuchar en un puerto abierto, y los programas que necesitan comunicarse con él podrían conectarse a ese puerto. Esto podría abrir la puerta a la administración remota, pero también puede restringir el servicio para que solo escuche las conexiones locales.

Todo lo anterior trata de decirte que estás tomando el enfoque equivocado. Pero también está la cuestión del problema en cuestión. Su programa se comporta de una manera en el depurador y de otra forma fuera de él. ¿Cómo está depurando el servicio en primer lugar, si no está instalado? ¿En qué cuenta de usuario se está ejecutando su servicio? ¿Tu depurador? ¿Qué técnicas de depuración ha probado que no involucren el depurador (por ejemplo, writeln en un archivo de registro para seguir las acciones de su programa)?