Mettre un programme comme service windows

atifelkhachine Messages postés 43 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 janvier 2008 - 18 juil. 2005 à 17:20
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006 - 7 mars 2006 à 18:12
Salut les amis.j veux savoir comment lancer mon programme comme service windows.

8 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
18 juil. 2005 à 17:35
CreateService(), OpenService(), etc...
Si tu avais vraiment écrit un service, je pense que tu devrais savoir, non ?

ciao...
BruNews, MVP VC++
0
atifelkhachine Messages postés 43 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 janvier 2008
18 juil. 2005 à 17:51
non. j'ai cree juste un simple programme. mais quand j'entre
sur la mmchine qui execute mon programme avec terminal server, là je
voi pas mon programe avec les processus. alors un ami m'a dis que mon
prog dois se lancer comme service windows .. c'est juste ?
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
18 juil. 2005 à 18:05
ben il ne s'est surement pas installé en service tout seul.
Il ne faut d'ailleurs pas mettre nimporte quoi en tant que service, un service doit respecter certaines spécifications, voir MSDN à ce sujet.

ciao...
BruNews, MVP VC++
0
atifelkhachine Messages postés 43 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 janvier 2008
18 juil. 2005 à 18:14
Merci pour votre reponses ... mais j ai pas bien saisi ta
derniere reponse. j ai compri que si mon programe ne respecte pas
certaines spécifications alors il ne vat pas tourner comme service
windows .. c ca ? ou il suffi d'utiliser CreateService(),
OpenService(), pour faire le travail ...





Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
18 juil. 2005 à 19:05
Ton prog DOIT être écrit comme un service, seulement ensuite tu pourras l'inscrire au SCManager.

ciao...
BruNews, MVP VC++
0
atifelkhachine Messages postés 43 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 janvier 2008
19 juil. 2005 à 17:21
bonjour j'ai trouver ce code quelquepart et tout se passe bien
la compilation et tout .. mais quand j l 'execute il ne fonctionne pas
comme prevu car la fonction int Action(void) ne s'execute pas.... c'est
ou le probleme ??? MERCI



---------------------------------------

//Source developpé sous dev c++





//---------------------------------------------------------------------------



//Commande preprocesseur



#include <stdio.h>

#include
<time.h>
//Pour la fonction sleep

#include
<winsock2.h>
//Pour le client winsock



//Déclaration des variables

SERVICE_STATUS m_ServiceStatus;

SERVICE_STATUS_HANDLE m_ServiceStatusHandle;

bool bRunning=true;







//Déclaration des fonctions

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);

void WINAPI ServiceCtrlHandler(DWORD Opcode);

bool InstallService();

bool DeleteService();

int Action(void);

//---------------------------------------------------------------------------















//---------------------------------------------------------------------------

//Fonction principal

//Analyse des arguments passé en paramètre.

//Si pas de paramètre passé en argument initialisation du service



int main(int argc, char* argv[])

{

if(argc>1)

{

if(strcmp(argv[1],"-i")==0) //Control de l'argument passé au prog


{InstallService();}
//Rien lancement du service


//-i pour enregistement du service



if(strcmp(argv[1],"-d")==0) //-d pour désactivation du service

{DeleteService();}

}

else

{

//Si pas d'argument :

//déclaration du service et démarrage dans ServiceMain()



SERVICE_TABLE_ENTRY DispatchTable[]={{"Connexion",ServiceMain},{NULL,NULL}};

StartServiceCtrlDispatcher(DispatchTable);

}

return 0;

}

//---------------------------------------------------------------------------















//---------------------------------------------------------------------------

//Fontion principal où se situe le code que le service execute



void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)

{



m_ServiceStatus.dwServiceType =SERVICE_WIN32;

m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;

m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

m_ServiceStatus.dwWin32ExitCode = 0;

m_ServiceStatus.dwServiceSpecificExitCode = 0;

m_ServiceStatus.dwCheckPoint = 0;

m_ServiceStatus.dwWaitHint = 0;



m_ServiceStatusHandle = RegisterServiceCtrlHandler("Connexion",ServiceCtrlHandler);

if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)

{

return;

}



m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;

m_ServiceStatus.dwCheckPoint = 0;

m_ServiceStatus.dwWaitHint = 0;

if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))

{



}



bRunning=true;



//C'est la qu'il faut mettre les commandes qui s'éxécuteront pendant tout le temps ou le service fontcionne

while(bRunning)

{

//Commande que le service execute

//les 4 ligne du dessous
servent juste aà montrer que le service tourne et que tout les minutes
il écrit test dans le fichier text

FILE * log ;

log = fopen ( "c:\\log.txt" , "a" ) ;

fprintf ( log , "test\n" ) ;

fclose ( log ) ;

Sleep(1000); //Le temps est
en millisseconde, sert à temporiser l'action pour pas quelle s'execute
en boucle

//on peut aussi avoir une action qui se déclanche sur un évènement partculié

Action(); //Fonction où mettre le code a executer

}



return;

}





//---------------------------------------------------------------------------

//Fonction de control de l'état du service



void WINAPI ServiceCtrlHandler(DWORD Opcode)

{

switch(Opcode)

{

//Si le service reçoit la commande de se mettre en pause

case SERVICE_CONTROL_PAUSE:

m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;

break;



case SERVICE_CONTROL_CONTINUE:

m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;

break;



//Si le service reçoit la commande de stopper

case SERVICE_CONTROL_STOP:

m_ServiceStatus.dwWin32ExitCode = 0;

m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;

m_ServiceStatus.dwCheckPoint = 0;

m_ServiceStatus.dwWaitHint = 0;




SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);


bRunning=false; //donc la boucle plus haut ne s'effectura plus

break;



case SERVICE_CONTROL_INTERROGATE:

break;

}

return;

}





//---------------------------------------------------------------------------

//Si l'argument est -i enregistement du service ici



bool InstallService()

{

char strDir[1024];

SC_HANDLE schSCManager,schService;



GetCurrentDirectory(1024,strDir);

strcat(strDir,"\\connexion.exe");





schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);



if (schSCManager == NULL)

return false;



LPCTSTR lpszBinaryPathName=strDir;



schService = CreateService(schSCManager,"Connexion","Connexion réseaux",

SERVICE_ALL_ACCESS, // Type d'acces

SERVICE_WIN32_OWN_PROCESS, // Type de service

SERVICE_AUTO_START, // Pour le demarrage automatique

SERVICE_ERROR_NORMAL, // error control type

lpszBinaryPathName, // service's binary


NULL,
// no load ordering group


NULL,
// no tag identifier


NULL,
// no dependencies


NULL,
// Si null demarrer en tant que compte system


NULL);
// Mot de passe : null si demarrer en tant que system



if (schService == NULL)

return false;



CloseServiceHandle(schService);



return true;

}





//---------------------------------------------------------------------------

//Si l'argument est -d désactivation du service ici



bool DeleteService()

{

SC_HANDLE schSCManager;

SC_HANDLE hService;



schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);



if (schSCManager == NULL)

return false;



hService=OpenService(schSCManager,"Connexion",SERVICE_ALL_ACCESS);



if (hService == NULL)

return false;



if(DeleteService(hService)==0)

return false;



if(CloseServiceHandle(hService)==0)

return false;

else

return true;

}





//---------------------------------------------------------------------------

//Fonction pour la connexion a internet



int Action(void)

{

int i=0;

printf("\n%d",i++);

return 0;

}









----------------------------------------
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
20 juil. 2005 à 13:55
Hello j'ai aussi utiliser ce code, voici comment il fonctionne :



Il faut d'abord que le service soit installé pour cela lance le programme avec le paramètre -i : nomduprog.exe -i



Après vérifie si le service s'est correctement dans le registe va voir
les clés dans HKLM\SYSTEM\CurrentControlSet\Services\nom_du_service



le nom du service est définit dans le code (dans la fonction CreateService, je crois)



tu peux démarrer ton service en allant dans la console des services
(menu démarrer -> exécuter -> écrit: services.msc -> enter),
trouve ton service et clique droit et démarrer.



mais dans ta fonction Action tu met un printf, hélas tu ne verras
pas ton texte car un programme fonctionnant en service tourne en
arrière plan et de ce fait tu ne le voit pas.
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
7 mars 2006 à 18:12
<OL>
<LI>Bonjour je tombe par hazard sur ce poste.
C'est moi qui est poster ce code : http://www.cppfrance.com/codes/SERVICE-WINDOWS-POUR-MAINTENIR-CONNEXION-INTERNET_27660.aspx

La fonction action n'avait que peut d'interet, c'est pour cela que j'avait posté le code avec pour tester que le service fontionne pour les personne qui avait besoin de juste verifier si le service tounait bien.
//Commande que le service execute </LI>
<LI> <SAMP>//les 4 ligne du dessous servent juste aà montrer que le service tourne et que tout les minutes il écrit test dans le fichier text</SAMP>
<LI> FILE * log ;
<LI> log = fopen ( <VAR>"c:\\log.txt"</VAR> , <VAR>"a"</VAR> ) ;
<LI> fprintf ( log , <VAR>"test\n"</VAR> ) ;
<LI> fclose ( log ) ;
<LI> Sleep(6000); <SAMP>//Le temps est en millisseconde, sert à temporiser l'action pour pas quelle s'execute en boucle</SAMP> </LI></OL>
Car un service par définition ne peut interagire avec l'utilisateur.
0