deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 2016
-
4 nov. 2006 à 13:16
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 2016
-
4 nov. 2006 à 14:03
Bonjour à tous.
Voici mon problème,
J'ai crée un timer dans mon service, mais celui-ci ne fonctionne pas (je suis certain que c'est le timer car j'ai tester mon service sans et il va impec). Il y à t-il quelque chose que j'ai oublier?
Il devrai inscrire test tout les minute ds un fichier log à la racine, mais ne le fait pas :s
Voici le code (en gras : ce qui concerne le timer) :
/* TASK : point d'entré du programme.*/
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE a, PSTR b, int v){
SERVICE_TABLE_ENTRY steDispatche;
steDispatche.lpServiceName = "SHUTD"; /* Nom du service. */
steDispatche.lpServiceProc = ServiceMain; /* Pointeur sur la fonction "main" du service. */
/* On démarre le service. */
if(!StartServiceCtrlDispatcher(&steDispatche)){
OutputDebugStringA("\n SetServiceStatus (fct : ShutD1HCtrlHandler) fail !");
return;
}
}
/* TASK : Fonction main du service. (Mettre les instructions à effectuer).*/
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv){
/* On crée le handle du service. Ici c'est le handle du programme de control du service (ici : ShutD1HCtrlHandler). */
sshServiceHandle = RegisterServiceCtrlHandler("SHUTD",ShutD1HCtrlHandler);
if (sshServiceHandle == (SERVICE_STATUS_HANDLE)0)return;
/* Après avoir démarré le service, on change sont statut pour l'éxécuter. */
ssService.dwCurrentState = SERVICE_RUNNING;
ssService.dwCheckPoint = 0;
ssService.dwWaitHint = 0;
if (!SetServiceStatus (sshServiceHandle, &ssService)){
OutputDebugStringA("\n SetServiceStatus (fct : ServiceMain) fail !");
return;
}
/*FILE * f;
while(boR){
f = fopen("c:\\log.txt","a+");
fprintf(f,"test\n");
fclose(f);
}*/
uiptId SetTimer(NULL,0,6000,(TIMERPROC)TimerProc); /* Si hwnd NULL, l'id du timer est ignoré (2ième paramètre).
* Si Hwnd = NULL, SetTimer renvoie un id de type UINT_PTR, qui peut être utilisé
* pour identifier le timer. Et peu être employé dans KillTime().
*/
}
/* TASK : Gère le changement de statut du service. */
void WINAPI ShutD1HCtrlHandler(DWORD Opcode){
switch(Opcode){
case SERVICE_CONTROL_PAUSE : ssService.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE : ssService.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP : {
ssService.dwWin32ExitCode = 0;
ssService.dwCurrentState = SERVICE_STOPPED;
ssService.dwCheckPoint = 0;
ssService.dwWaitHint = 0;
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 nov. 2006 à 13:29
Quelle est la valeur retournée par SetTimer?
Es-tu sur que tu n'entres pas dans TimerProc?
Petit truc qui n'a rien a voir: pourquoi ce cas (TIMERPROC)?
Il suffit de bien déclarer ton TimerProc, et ce cast inutile pourra être enlevé
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 4 nov. 2006 à 13:34
L'ennui vecchio c'est que je ne sais vérifier la valeur retournée , car je ne peut rien afficher dutout :s car mes msgbox ne s'affiche pas sur le mm "bureau" :s
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 nov. 2006 à 13:49
Je sais pas comment marchent les services, mais la c'est normal que le programme se termine directement?
Parce que là, la fonction ServiceMain se termine et le programme aussi.
C'est peut être effectivment à toi de mettre ta boucle des messages
Et si une simple boucle te suffit, pourquoi ne pas utiliser simplement la fonction Sleep au lieu d'eun timer?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 nov. 2006 à 13:53
Par exemple dans ce code, je vois un WaitForSingleObject à la fin de ServiceMain. Il te faut un truc dans ce genre la pour éviter que le service ne se termine tout de suite.
La solution suivante me semble aussi convenable:
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 4 nov. 2006 à 13:53
Oui c'est normal. Oui c'est ce que je vien de faire, une boucle while(boOk) et quand on stop le service boOk passe à 0 et le test s'arrete. Mais bon je trouve cela moin joli avec un Sleep lol. Enfin bon je fait le Sleep pour qu'il soit opérationnel et puis je chercherai pour le timer. Je pense que je mettrai la fonction SetTimer avant une boucle du mm type.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 nov. 2006 à 13:58
En fait pour WM_TIMER, si on ne spécifie pas de fenêtre, il est envoyé à la fonction DefWindowProc, qui se charge ensuite d'appeler le TimerProc.
Ici je vois pas l'utilité de créer une boucle de messages rien que pour ca.
Pourquoi le Sleep ne te convient-il pas?