Création d'un Service Windows

Création d'un Service Windows - C - Programmation

Marsh Posté le 27-06-2005 à 20:31:54    

Alors voila quelques heures que je me bat avec CreateService().
 
J'ai un programme qui doit s'installer en tant que Service Windows. J'ai mis ce code là :

Code :
  1. SC_HANDLE hSCMan;
  2. SC_HANDLE hService;
  3. char buffer[MAX_PATH+3];
  4. hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  5. if ( hSCMan == NULL )
  6. {
  7.  alog("Erreur lors de l'ouverture du Serivces Manager" );
  8.  return;
  9. }
  10. sprintf(buffer, "\"%s\"", filename);
  11. hService = CreateService(
  12.  hSCMan,
  13.  "bot-control",
  14.  "Botware Security System",
  15.  GENERIC_EXECUTE | GENERIC_READ,
  16.  SERVICE_WIN32_OWN_PROCESS,
  17.  SERVICE_AUTO_START,
  18.  SERVICE_ERROR_IGNORE,
  19.  buffer,
  20.  NULL,
  21.  NULL,
  22.  NULL,
  23.  NULL,
  24.  NULL
  25. );
  26. if ( hService == NULL )
  27. {
  28.  if ( GetLastError() == 1073 )
  29.  {
  30.   if ( !(hService = OpenService(hSCMan, "bot-control", SC_MANAGER_ALL_ACCESS)) )
  31.   {
  32.    alog("Erreur lors de la suppression du service (%d)", GetLastError());
  33.    return;
  34.   }
  35.   if ( DeleteService(hService) )
  36.   {
  37.    CloseServiceHandle(hService);
  38.    CloseServiceHandle(hSCMan);
  39.    alog("Service supprimé, veuillez relancer l'installation" );
  40.    return;
  41.   }
  42.   else
  43.    alog("Erreur lors de la suppression du service (%d)", GetLastError());
  44.  }
  45.  alog("Erreur lors de la création du service (%d)", GetLastError());
  46.  return;
  47. }
  48. alog("Service créé avec succès, tapez net start bot-control" );


 
pour information, buffer c'est un char [MAX_PATH+3] qui contient l'argument 0 de main() entouré de " (pour proteger les espaces).
 
Le service est bien créé, mais impossible de le lancer, j'obtient l'erreur ci dessous par exemple : [img]www.rclsilver.net/~thomas/ss_srv.jpg[/img]
 
Je voudrais savoir ou serait mon probleme.
 
PS: C'est une application console pour le moment, mais ça va etre une Win 32 par la suite..
 
Merci d'avance

Reply

Marsh Posté le 27-06-2005 à 20:31:54   

Reply

Marsh Posté le 28-06-2005 à 11:08:26    

MAX_PATH c'est la valeur max d'un path. Tu peux mettre MAX_PATH+3, la longueur max ça reste MAX_PATH.
Inspire toi plutot du code de la MSDN, basé sur GetModuleFileName:
http://msdn.microsoft.com/library/ [...] ervice.asp
Pour ton problème, le problème est ailleurs. Le code que tu donnes installe le service situé à l'emplacement donné par buffer, soit toi même. Sauf que là il manque tout le code nécessaire pour faire un service. Tu as juste écris le code nécessaire à installer un service.
Voir ServiceMain, StartServiceCtrlDispatcher, ...
http://msdn.microsoft.com/library/ [...] _tasks.asp
http://www.codeproject.com/system/ [...] ervice.asp
Tu devrais peut être jeter un oeil à srvany aussi.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 28-06-2005 à 12:31:41    

un exe "classique" ne peut pas etre service ?
 
 
et j'ai mais MAX_PATH+3 pour ajouter les " autour du path


Message édité par rclsilver le 28-06-2005 à 12:32:21
Reply

Marsh Posté le 28-06-2005 à 12:32:35    

Si, encore faut-il qu'il soit codé pour ça. Relis mon post, et le lien sur codeproject...
Et avec MAX_PATH+3, tu génères un noms > MAX_PATH, donc un chemin invalide (c'est un détail, l'erreur n'est pas là). MAX = valeur max, à ne pas dépasser. MAX+3 = 3 de plus que les MAX.


Message édité par HelloWorld le 28-06-2005 à 12:34:03

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 28-06-2005 à 15:37:10    

Je te remercie HelloWorld, effectivement, je ne savais pas qu'il fallait faire autant de truc pour un service :) mais bon, là ça fonctionne :) merci beaucoup :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed