Ik heb mijn app onder Windows 9x al helemaal aan de praat als service, dwz hij start netjes op als Windows opstart en sluit netjes af als Windows klaar is. Er is echter 1 probleem, nl als de gebruiker uitlogt dan sluit mijn programma ook. Dat is natuurlijk niet de bedoeling van een service. Volgens MSDN gebruik je dan de functie RegisterServiceProcess om te zorgen dat ook na het uitloggen het programma nog draait. Hiertoe heb ik de volgende code geschreven:
Dit gaat prima tijdens het opstarten, registeredSP staat keurig op TRUE zoals het hoort. Echter als ik nu Windows afsluit of de service tussentijds afsluit, dan krijg ik de volgende foutmelding:
Ik heb ff gekeken, en deze foutmelding verschijnt pas helemaal aan het eind. Mijn code daar is:
Ik zie dus eerst de Messagebox, en daarna komt pas de foutmelding. Je zou denken dat het er aan ligt dat ik de RegisterServiceProcess(GetCurrentProcessId(), 0) oversla en dat het daardoor niet werkt, maar ik krijg ook met die unregister nog de foutmelding. Het moet trouwens wel aan die RegisterServiceProcess liggen, want als ik het hele stuk code eruit haal zijn er geen problemen. Heeft iemand een idee wat hier mis gaat?
Edit: Laat ik er maar ff bijzetten dat ik al op Google en MSDN heb gezocht, maar niets nuttigs gevonden heb.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| //declaraties en definities HMODULE hKernel; typedef DWORD (*PFNRSP) (DWORD, DWORD); PFNRSP pfnRSP; //de echte code hKernel = LoadLibrary( "kernel32.dll" ); if( hKernel != NULL ) { pfnRSP = (PFNRSP) GetProcAddress( hKernel, "RegisterServiceProcess" ); if( pfnRSP != NULL ) { if( pfnRSP(GetCurrentProcessId(), 1) ) registeredSP = TRUE; } FreeLibrary( hKernel ); } |
Dit gaat prima tijdens het opstarten, registeredSP staat keurig op TRUE zoals het hoort. Echter als ik nu Windows afsluit of de service tussentijds afsluit, dan krijg ik de volgende foutmelding:
code:
1
2
3
4
5
6
| Microsoft Visual C++ Runtime Library Buffer overrun detected! Program: <programmanaam> A buffer overrun has been detected which has corrupted the program's internal state. The program cannot safely continue execution and must now be terminated. |
Ik heb ff gekeken, en deze foutmelding verschijnt pas helemaal aan het eind. Mijn code daar is:
C:
1
2
3
4
5
6
7
8
9
10
| //message loop while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } MessageBox(NULL,"","",0); return (int) msg.wParam; |
Ik zie dus eerst de Messagebox, en daarna komt pas de foutmelding. Je zou denken dat het er aan ligt dat ik de RegisterServiceProcess(GetCurrentProcessId(), 0) oversla en dat het daardoor niet werkt, maar ik krijg ook met die unregister nog de foutmelding. Het moet trouwens wel aan die RegisterServiceProcess liggen, want als ik het hele stuk code eruit haal zijn er geen problemen. Heeft iemand een idee wat hier mis gaat?
Edit: Laat ik er maar ff bijzetten dat ik al op Google en MSDN heb gezocht, maar niets nuttigs gevonden heb.
[ Voor 5% gewijzigd door SWfreak op 30-05-2003 20:33 . Reden: more P&W beleid compliance ]