Je cherche à développer un service NT (compatible Win 2K et XP) sous
Windev (mini version 10).
Es ce possible et quels sont les pièges à éviter.
Peut-on gérer le service avec les outils windows.
Si la création et la gestion de service est impossible avec l'outil
windev, peut-on trouver une solution médiane qui remplace un service
par un système équivalent entièrement développer sous windev.
Je vous remercie
@+
--
Jean-Yves BURLOT
suivre ce lien pour répondre :
http://cerbermail.com/?zbQ7wrKUbu
;-)
--
lapalissade: tout message n'est recu que s'il est lu. tout programme windows à la structure: while (getmessage()) dispatchmessage() donc pendant le traitement d'un message , un thread ne peut traiter d'autre message
Mais pourquoi peut-on trapper l'évenement WM_SYSCOMMAND lorsque l'arret de l'appli est effectuée depuis l'interface :
// code projet Evénement("QUITTE", "*.*", 0x112)//WM_SYSCOMMAND // procédure globale PROCEDURE QUITTE(eMessage, wParam, ePAram ) Trace(eMessage + "-" +wParam +"-" +ePAram) SI wParam = 61536 ALORS SI pas OuiNon("Fin?") ALORS RENVOYER Faux FIN FIN
Mais pas quand XYNT envoie (au choix) un : - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_SYSCOMMAND, SC_CLOSE,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_CLOSE,0,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_QUIT,0,0);
Solution simple : reprendre le code XYNTService, et lors de l'arret du service, utiliser un autre type de dialogue avec l'appli Windev (utilisation d'un fichier, d'une Socket, d'un pipe...)
tout a fait. amha, la solution la plus simple: - temporiser xyntservice pour qu'il ne terminate que si x secondes se sont écoulés
Ca c'est déjà prévu (un paramètre dans le fichier INI)
- modifier l'exe pour lui faire tester le wm_quit (donc faire une fenetre principale) et faire les traitements : soit sur timer et ne pas durer plus de x secondes à chaque fois soit sur thread, et le traitement du wm_quit doit synchroniser le thread
C'est ce que j'ai testé (cf plus haut...). L'évenement n'est pas détecté...
sinon pour notifer un programme par un autre, le plus simple/rapide est d'utiliser les signaux (api createevent, openevent, waitforsingleevent)
Je vais jeter un oeil...
A+
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Dans son message précédent, patrice a écrit :
lapalissade: tout message n'est recu que s'il est lu.
tout programme windows à la structure:
while (getmessage()) dispatchmessage()
donc pendant le traitement d'un message , un thread ne peut traiter d'autre
message
Mais pourquoi peut-on trapper l'évenement WM_SYSCOMMAND lorsque l'arret
de l'appli est effectuée depuis l'interface :
// code projet
Evénement("QUITTE", "*.*", 0x112)//WM_SYSCOMMAND
// procédure globale
PROCEDURE QUITTE(eMessage, wParam, ePAram )
Trace(eMessage + "-" +wParam +"-" +ePAram)
SI wParam = 61536 ALORS
SI pas OuiNon("Fin?") ALORS
RENVOYER Faux
FIN
FIN
Mais pas quand XYNT envoie (au choix) un :
- PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_SYSCOMMAND,
SC_CLOSE,0);
- PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_CLOSE,0,0);
- PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_QUIT,0,0);
Solution simple : reprendre le code XYNTService, et lors de l'arret du
service, utiliser un autre type de dialogue avec l'appli Windev
(utilisation d'un fichier, d'une Socket, d'un pipe...)
tout a fait.
amha, la solution la plus simple:
- temporiser xyntservice pour qu'il ne terminate que si x secondes se
sont écoulés
Ca c'est déjà prévu (un paramètre dans le fichier INI)
- modifier l'exe pour lui faire tester le wm_quit (donc faire une
fenetre principale) et faire les traitements :
soit sur timer et ne pas durer plus de x secondes à chaque fois
soit sur thread, et le traitement du wm_quit doit synchroniser le
thread
C'est ce que j'ai testé (cf plus haut...).
L'évenement n'est pas détecté...
sinon pour notifer un programme par un autre, le plus simple/rapide est
d'utiliser les signaux (api createevent, openevent, waitforsingleevent)
Je vais jeter un oeil...
A+
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
lapalissade: tout message n'est recu que s'il est lu. tout programme windows à la structure: while (getmessage()) dispatchmessage() donc pendant le traitement d'un message , un thread ne peut traiter d'autre message
Mais pourquoi peut-on trapper l'évenement WM_SYSCOMMAND lorsque l'arret de l'appli est effectuée depuis l'interface :
// code projet Evénement("QUITTE", "*.*", 0x112)//WM_SYSCOMMAND // procédure globale PROCEDURE QUITTE(eMessage, wParam, ePAram ) Trace(eMessage + "-" +wParam +"-" +ePAram) SI wParam = 61536 ALORS SI pas OuiNon("Fin?") ALORS RENVOYER Faux FIN FIN
Mais pas quand XYNT envoie (au choix) un : - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_SYSCOMMAND, SC_CLOSE,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_CLOSE,0,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_QUIT,0,0);
Solution simple : reprendre le code XYNTService, et lors de l'arret du service, utiliser un autre type de dialogue avec l'appli Windev (utilisation d'un fichier, d'une Socket, d'un pipe...)
tout a fait. amha, la solution la plus simple: - temporiser xyntservice pour qu'il ne terminate que si x secondes se sont écoulés
Ca c'est déjà prévu (un paramètre dans le fichier INI)
- modifier l'exe pour lui faire tester le wm_quit (donc faire une fenetre principale) et faire les traitements : soit sur timer et ne pas durer plus de x secondes à chaque fois soit sur thread, et le traitement du wm_quit doit synchroniser le thread
C'est ce que j'ai testé (cf plus haut...). L'évenement n'est pas détecté...
sinon pour notifer un programme par un autre, le plus simple/rapide est d'utiliser les signaux (api createevent, openevent, waitforsingleevent)
Je vais jeter un oeil...
A+
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Daniel
Romain PETIT a écrit :
Dans son message précédent, patrice a écrit :
lapalissade: tout message n'est recu que s'il est lu. tout programme windows à la structure: while (getmessage()) dispatchmessage() donc pendant le traitement d'un message , un thread ne peut traiter d'autre message
Mais pourquoi peut-on trapper l'évenement WM_SYSCOMMAND lorsque l'arret de l'appli est effectuée depuis l'interface :
// code projet Evénement("QUITTE", "*.*", 0x112)//WM_SYSCOMMAND // procédure globale PROCEDURE QUITTE(eMessage, wParam, ePAram ) Trace(eMessage + "-" +wParam +"-" +ePAram) SI wParam = 61536 ALORS SI pas OuiNon("Fin?") ALORS RENVOYER Faux FIN FIN
Mais pas quand XYNT envoie (au choix) un : - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_SYSCOMMAND, SC_CLOSE,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_CLOSE,0,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_QUIT,0,0);
Solution simple : reprendre le code XYNTService, et lors de l'arret du service, utiliser un autre type de dialogue avec l'appli Windev (utilisation d'un fichier, d'une Socket, d'un pipe...)
tout a fait. amha, la solution la plus simple: - temporiser xyntservice pour qu'il ne terminate que si x secondes se sont écoulés
Ca c'est déjà prévu (un paramètre dans le fichier INI)
- modifier l'exe pour lui faire tester le wm_quit (donc faire une fenetre principale) et faire les traitements : soit sur timer et ne pas durer plus de x secondes à chaque fois soit sur thread, et le traitement du wm_quit doit synchroniser le thread
C'est ce que j'ai testé (cf plus haut...). L'évenement n'est pas détecté...
sinon pour notifer un programme par un autre, le plus simple/rapide est d'utiliser les signaux (api createevent, openevent, waitforsingleevent)
Je vais jeter un oeil...
A+
Le WM_quit de XYNTService va générer dans l'appli Windev un évènement WM_close.
En déclenchant ton code dans Windev avec WM_close cela devrait le faire.
-- suivre ce lien pour répondre: http://cerbermail.com/?2KrV3YZXnn Daniel ;-)
Romain PETIT a écrit :
Dans son message précédent, patrice a écrit :
lapalissade: tout message n'est recu que s'il est lu.
tout programme windows à la structure:
while (getmessage()) dispatchmessage()
donc pendant le traitement d'un message , un thread ne peut traiter
d'autre
message
Mais pourquoi peut-on trapper l'évenement WM_SYSCOMMAND lorsque l'arret
de l'appli est effectuée depuis l'interface :
// code projet
Evénement("QUITTE", "*.*", 0x112)//WM_SYSCOMMAND
// procédure globale
PROCEDURE QUITTE(eMessage, wParam, ePAram )
Trace(eMessage + "-" +wParam +"-" +ePAram)
SI wParam = 61536 ALORS
SI pas OuiNon("Fin?") ALORS
RENVOYER Faux
FIN
FIN
Mais pas quand XYNT envoie (au choix) un :
- PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_SYSCOMMAND,
SC_CLOSE,0);
- PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_CLOSE,0,0);
- PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_QUIT,0,0);
Solution simple : reprendre le code XYNTService, et lors de l'arret du
service, utiliser un autre type de dialogue avec l'appli Windev
(utilisation d'un fichier, d'une Socket, d'un pipe...)
tout a fait.
amha, la solution la plus simple:
- temporiser xyntservice pour qu'il ne terminate que si x secondes se
sont écoulés
Ca c'est déjà prévu (un paramètre dans le fichier INI)
- modifier l'exe pour lui faire tester le wm_quit (donc faire une
fenetre principale) et faire les traitements :
soit sur timer et ne pas durer plus de x secondes à chaque fois
soit sur thread, et le traitement du wm_quit doit synchroniser le
thread
C'est ce que j'ai testé (cf plus haut...).
L'évenement n'est pas détecté...
sinon pour notifer un programme par un autre, le plus simple/rapide est
d'utiliser les signaux (api createevent, openevent, waitforsingleevent)
Je vais jeter un oeil...
A+
Le WM_quit de XYNTService va générer dans l'appli Windev un évènement
WM_close.
En déclenchant ton code dans Windev avec WM_close cela devrait le faire.
--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
lapalissade: tout message n'est recu que s'il est lu. tout programme windows à la structure: while (getmessage()) dispatchmessage() donc pendant le traitement d'un message , un thread ne peut traiter d'autre message
Mais pourquoi peut-on trapper l'évenement WM_SYSCOMMAND lorsque l'arret de l'appli est effectuée depuis l'interface :
// code projet Evénement("QUITTE", "*.*", 0x112)//WM_SYSCOMMAND // procédure globale PROCEDURE QUITTE(eMessage, wParam, ePAram ) Trace(eMessage + "-" +wParam +"-" +ePAram) SI wParam = 61536 ALORS SI pas OuiNon("Fin?") ALORS RENVOYER Faux FIN FIN
Mais pas quand XYNT envoie (au choix) un : - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_SYSCOMMAND, SC_CLOSE,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_CLOSE,0,0); - PostThreadMessage(pProcInfo[nIndex].dwThreadId,WM_QUIT,0,0);
Solution simple : reprendre le code XYNTService, et lors de l'arret du service, utiliser un autre type de dialogue avec l'appli Windev (utilisation d'un fichier, d'une Socket, d'un pipe...)
tout a fait. amha, la solution la plus simple: - temporiser xyntservice pour qu'il ne terminate que si x secondes se sont écoulés
Ca c'est déjà prévu (un paramètre dans le fichier INI)
- modifier l'exe pour lui faire tester le wm_quit (donc faire une fenetre principale) et faire les traitements : soit sur timer et ne pas durer plus de x secondes à chaque fois soit sur thread, et le traitement du wm_quit doit synchroniser le thread
C'est ce que j'ai testé (cf plus haut...). L'évenement n'est pas détecté...
sinon pour notifer un programme par un autre, le plus simple/rapide est d'utiliser les signaux (api createevent, openevent, waitforsingleevent)
Je vais jeter un oeil...
A+
Le WM_quit de XYNTService va générer dans l'appli Windev un évènement WM_close.
En déclenchant ton code dans Windev avec WM_close cela devrait le faire.
-- suivre ce lien pour répondre: http://cerbermail.com/?2KrV3YZXnn Daniel ;-)
Romain PETIT
Daniel avait énoncé :
Le WM_quit de XYNTService va générer dans l'appli Windev un évènement WM_close.
En déclenchant ton code dans Windev avec WM_close cela devrait le faire.
Non, c'est bien ça le problème... auncun évenement n'est détecté...
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Daniel avait énoncé :
Le WM_quit de XYNTService va générer dans l'appli Windev un évènement
WM_close.
En déclenchant ton code dans Windev avec WM_close cela devrait le faire.
Non, c'est bien ça le problème... auncun évenement n'est détecté...
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Le WM_quit de XYNTService va générer dans l'appli Windev un évènement WM_close.
En déclenchant ton code dans Windev avec WM_close cela devrait le faire.
Non, c'est bien ça le problème... auncun évenement n'est détecté...
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
//
Romain PETIT a écrit :
Non, c'est bien ça le problème... auncun évenement n'est détecté...
stMsg est une structure hwnd est un entier nMessage est un entier sans signe wParam est un entier lParam est un entier time est un entier pt est un entier FIN
Msg est un stMsg
TANTQUE API("User32.dll","GetMessageA",&Msg,Null,0,0) <> 0 Multitache(-10) FIN
Romain PETIT a écrit :
Non, c'est bien ça le problème... auncun évenement n'est détecté...
stMsg est une structure
hwnd est un entier
nMessage est un entier sans signe
wParam est un entier
lParam est un entier
time est un entier
pt est un entier
FIN
Msg est un stMsg
TANTQUE API("User32.dll","GetMessageA",&Msg,Null,0,0) <> 0
Multitache(-10)
FIN
Non, c'est bien ça le problème... auncun évenement n'est détecté...
stMsg est une structure hwnd est un entier nMessage est un entier sans signe wParam est un entier lParam est un entier time est un entier pt est un entier FIN
Msg est un stMsg
TANTQUE API("User32.dll","GetMessageA",&Msg,Null,0,0) <> 0 Multitache(-10) FIN
Romain PETIT
// a exposé le 14/01/2008 :
Msg est un stMsg
TANTQUE API("User32.dll","GetMessageA",&Msg,Null,0,0) <> 0 Multitache(-10) FIN
Non...même avec la bonne structure (cf ci-dessous)... Je suppose que le programme WD intercepte le message WM_QUIT en amont (éventuellement redistribué lors de l'utilisation de Evenement) mais ce message n'est pas relayé par ailleurs...
A+
stPOINTAPI est une structure x est un entier y est un entier FIN
stMsg est une structure hwnd est un entier nMessage est un entier wParam est un entier lParam est un entier time est un entier pt est un stPOINTAPI FIN
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
// a exposé le 14/01/2008 :
Msg est un stMsg
TANTQUE API("User32.dll","GetMessageA",&Msg,Null,0,0) <> 0
Multitache(-10)
FIN
Non...même avec la bonne structure (cf ci-dessous)...
Je suppose que le programme WD intercepte le message WM_QUIT en amont
(éventuellement redistribué lors de l'utilisation de Evenement) mais ce
message n'est pas relayé par ailleurs...
A+
stPOINTAPI est une structure
x est un entier
y est un entier
FIN
stMsg est une structure
hwnd est un entier
nMessage est un entier
wParam est un entier
lParam est un entier
time est un entier
pt est un stPOINTAPI
FIN
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
TANTQUE API("User32.dll","GetMessageA",&Msg,Null,0,0) <> 0 Multitache(-10) FIN
Non...même avec la bonne structure (cf ci-dessous)... Je suppose que le programme WD intercepte le message WM_QUIT en amont (éventuellement redistribué lors de l'utilisation de Evenement) mais ce message n'est pas relayé par ailleurs...
A+
stPOINTAPI est une structure x est un entier y est un entier FIN
stMsg est une structure hwnd est un entier nMessage est un entier wParam est un entier lParam est un entier time est un entier pt est un stPOINTAPI FIN
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Romain PETIT
Romain PETIT a écrit :
Hum, je crois que l'explication est ici... http://support.microsoft.com/kb/462038/fr
En envoyant un PostMessage(lehandledelafenetre, 0x0012,0,0), celui-ci est bien reçu...
Mais problème...une appli en tant que service n'a pas forcément de fenetre...
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Romain PETIT a écrit :
Hum, je crois que l'explication est ici...
http://support.microsoft.com/kb/462038/fr
En envoyant un PostMessage(lehandledelafenetre, 0x0012,0,0), celui-ci
est bien reçu...
Mais problème...une appli en tant que service n'a pas forcément de
fenetre...
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Hum, je crois que l'explication est ici... http://support.microsoft.com/kb/462038/fr
En envoyant un PostMessage(lehandledelafenetre, 0x0012,0,0), celui-ci est bien reçu...
Mais problème...une appli en tant que service n'a pas forcément de fenetre...
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
patrice
"Romain PETIT" a écrit dans le message de news:
Mais problème...une appli en tant que service n'a pas forcément de fenetre...
c'est pour ca que j'avais suggéré l'utilisation des signaux nommés
xymachin signale "xymachin_quitte"
et l'appli fait un truc du genre boucle si est_signalé("xymachin_quitte") alors finprogramme() ma_tache_repétitive_qui_doit_pas_durer_trop_longtemps() fin
"Romain PETIT" <VoirM@Signature.fin> a écrit dans le message de
news:mn.7be37d81cd5c0a55.2248@Signature.fin...
Mais problème...une appli en tant que service n'a pas forcément de
fenetre...
c'est pour ca que j'avais suggéré l'utilisation des signaux nommés
xymachin signale "xymachin_quitte"
et l'appli fait un truc du genre
boucle
si est_signalé("xymachin_quitte") alors finprogramme()
ma_tache_repétitive_qui_doit_pas_durer_trop_longtemps()
fin
Mais problème...une appli en tant que service n'a pas forcément de fenetre...
c'est pour ca que j'avais suggéré l'utilisation des signaux nommés
xymachin signale "xymachin_quitte"
et l'appli fait un truc du genre boucle si est_signalé("xymachin_quitte") alors finprogramme() ma_tache_repétitive_qui_doit_pas_durer_trop_longtemps() fin