Bonjour,
J'ai besoin de detecter un redemarrage dans un service
Config : XP sp3 32 bits.
j'ai le code suivant et dans la msdn il est bien precisé que SERCIVE_CONTROL_SHUTDOWN est un control code du handler que j'ai codé.
mais ça ne marche pas.
j'utilise la fonction : RegisterServiceCtrlHandlerEx avec son Handler appelé serviceCtrlHandler que j'appel dans le serviceMain() comme suit :
et voici le Handler ou j'ai différent control control dont le SHUTDOWN dans un switch :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 void WINAPI ServiceController::serviceMain(DWORD aArgc, LPTSTR *aArgv) { if(IsEnabledLogs()) { LCEnableTrace(true); } LCGetLogFileName("App.log"); LCTrace("run App deamon"); gServiceSingleton = getServiceSingleton(); //----- initialise service status ----- gServiceSingleton->mServiceStatus.dwServiceType = SERVICE_WIN32; gServiceSingleton->mServiceStatus.dwCurrentState = SERVICE_START_PENDING; gServiceSingleton->mServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE; gServiceSingleton->mServiceStatus.dwWin32ExitCode = 0; gServiceSingleton->mServiceStatus.dwServiceSpecificExitCode = 0; gServiceSingleton->mServiceStatus.dwCheckPoint = 0; gServiceSingleton->mServiceStatus.dwWaitHint = 0; gServiceSingleton->mLoopThreadID = GetCurrentThreadId(); gServiceSingleton->mServiceStatusHdl = RegisterServiceCtrlHandlerEx(kServiceName, serviceCtrlHandler, gServiceSingleton); if(!gServiceSingleton->mServiceStatusHdl) { return; } //----- Main loop ----- MSG lMsg; lMsg.message=0; DWORD lStatus; while(lMsg.message!=kStopServiceMessage) { LCTrace("waiting for msg/evt in main loop..."); lStatus=MsgWaitForMultipleObjectsEx(0,NULL,INFINITE,QS_ALLINPUT,MWMO_ALERTABLE); if(lStatus==WAIT_OBJECT_0) { while(PeekMessage(&lMsg, NULL, 0,0,PM_REMOVE)) { if(lMsg.message==kStopServiceMessage) break; if(lMsg.message==SERVICE_CONTROL_SESSIONCHANGE) { gServiceSingleton->mDeviceNotifier->lockDeviceWhenPowerCallback(lMsg.wParam,lMsg.lParam); } if(lMsg.message==SERVICE_CONTROL_SHUTDOWN) { gServiceSingleton->mDeviceNotifier->lockDeviceWhenPowerCallback(lMsg.wParam,lMsg.lParam); } else { TranslateMessage(&lMsg); DispatchMessage(&lMsg); } } } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 DWORD WINAPI ServiceController::serviceCtrlHandler(DWORD aCtrlCode, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext) { DWORD lResult = NO_ERROR; FILE* file = fopen(".\\tmp\\test.txt","w"); if(file) { fprintf(file,"Control code : %d\n",aCtrlCode); } switch(aCtrlCode) { case SERVICE_CONTROL_PAUSE: case SERVICE_CONTROL_CONTINUE: break; case SERVICE_CONTROL_SHUTDOWN: PostThreadMessage(gServiceSingleton->mLoopThreadID, SERVICE_CONTROL_SHUTDOWN , dwEventType,(LPARAM)lpEventData); break; case SERVICE_CONTROL_STOP: PostThreadMessage(gServiceSingleton->mLoopThreadID, kStopServiceMessage, 0, 0); gServiceSingleton->mServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; gServiceSingleton->mServiceStatus.dwWin32ExitCode = 0; gServiceSingleton->mServiceStatus.dwCheckPoint = 0; gServiceSingleton->mServiceStatus.dwWaitHint = 1500; //Wait 1.5s before checking again break; case SERVICE_CONTROL_DEVICEEVENT: PostThreadMessage(gServiceSingleton->mLoopThreadID, SERVICE_CONTROL_DEVICEEVENT, dwEventType,(LPARAM)lpEventData); //gServiceSingleton->mDeviceNotifier->deviceChangeCallback(dwEventType,(LPARAM)lpEventData); break; case SERVICE_CONTROL_SESSIONCHANGE: PostThreadMessage(gServiceSingleton->mLoopThreadID, SERVICE_CONTROL_SESSIONCHANGE , dwEventType,(LPARAM)lpEventData); break; default: OutputDebugString(_T("received another control")); lResult = ERROR_CALL_NOT_IMPLEMENTED; } SetServiceStatus(gServiceSingleton->mServiceStatusHdl, &gServiceSingleton->mServiceStatus); return lResult; }
J'écris dans un fichier pour savoir ce qu'il se passe quand je redémarre et tant qu'à faire je récupère le "control code" mais jamais je ne passe dans le Handler lorsque je redemarre ou que je change de session.
voici ce que dis la msdn je trouve ça contradictoire :
http://msdn.microsoft.com/en-us/libr...41(VS.85).aspx
Merci de votre Aide
Robux.
Partager