Accueil > > > GESTION DES SERVICES WINDOWS PAR LES API DANS UNE CLASSE
GESTION DES SERVICES WINDOWS PAR LES API DANS UNE CLASSE
Information sur la source
Description
Pour les amateurs de programmations systèmes; voici un code source intéressant (du moin pour moi)pour contrôler le fonctionnement d'un service ou process sur pc local ou distant: -Apprentissage d'insertion de variable environnement (getenv)dans le code (Nom du pc local dans le constructeur par défaut). -Service STOP-START-RESTART (distant-local). -Exemple d'un lancement d'une commande système par le biais de son programme (system). -Lancement d'une commande d'un process de sont programme 'pskill'. Rem:par le biais d'un prog externe (psexec.exe) il y a moyen de lancer des commandes système sur d'autres pc. NB:Ce code n'est qu'a titre d'exemple pour donner des idées à la programmation C/C++ pas pour dire cela est le meilleur code - à bonne entendeur salut! j'accepte toutes les remarques valables au niveau programmation pour l'évolution. Ceci à été placé dans une classe pour démonstartion d'un code autre que procédurale. Code à la fin pour tester la classe (reamon est un process d'antivirus n'oublié pas de le changer pour vos tests). A+
Source
- #include <windows>
- #include <stdlib>
- #include <iostream.h>
-
- //--------------------------------------------------------
- // DEBUT CLASSE SERVICE
- //--------------------------------------------------------
- class Cl_SVR {
- protected:
- string service;
- string nompc;
- int status;
- SC_HANDLE hSCManager;
- SC_HANDLE hService;
- BOOL bServiceStatus;
- BOOL bControlService;
- BOOL bStartServices;
- SERVICE_STATUS ServiceStatus;
- void Status();
- string getStatusString(int);
-
- public: // Les données et les méthodes publiques.
- Cl_SVR();
- Cl_SVR(const char *,const char *);
- ~Cl_SVR();
- string StatusSVR();
- void ChangeService(const char *);
- void ChangePc(const char *);
- string NomPc()const;
- string Service()const;
- void Stop();
- void Start();
- void ReStart();
- void PsKill(const char *);
- };
- //--------------------------------------------------------
- // FIN CLASSE SERVICE
- //--------------------------------------------------------
- //------------------------------------------------------------------------------
- // FONCTION : Constructeur
- // DESCRIPTION : Initialisation par défaut
- //-------------------------------------------------------------------------------
- Cl_SVR::Cl_SVR(): service("inort"), nompc("\\\\"){
- nompc+=getenv("COMPUTERNAME");
- Status();
- }//end procedure
-
- //------------------------------------------------------------------------------
- // FONCTION : Constructeur
- // DESCRIPTION : Initialisation par défaut
- //-------------------------------------------------------------------------------
- Cl_SVR::Cl_SVR(const char * s,const char * pc): service(s), nompc("\\\\"){
- nompc+=pc;
- Status();
- }//end procedure
-
- //------------------------------------------------------------------------------
- // FONCTION : Destructeur
- // DESCRIPTION : Destruction de l'objet
- //-------------------------------------------------------------------------------
- Cl_SVR::~Cl_SVR(){
- }//end procedure
-
- //------------------------------------------------------------------------------
- // FONCTION : Service_Status
- // DESCRIPTION : Permet de savoir le status de fonctionnement du service
- // RUNNING,STOOPED,PAUSE,PENDING,etc....
- //-------------------------------------------------------------------------------
- void Cl_SVR::Status(){
- //Fait la liaison avec le process manager des services
- hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
- if (hSCManager !=0){
- hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
- //Connection avec le service
- if (hService !=0){
- //Demande le status du service
- bServiceStatus = QueryServiceStatus(hService,&ServiceStatus);
- switch(ServiceStatus.dwCurrentState){
- case SERVICE_STOPPED:
- status=0;
- break;
- case SERVICE_START_PENDING:
- status=1;
- break;
- case SERVICE_STOP_PENDING:
- status=2;
- break;
- case SERVICE_RUNNING:
- status=3;
- break;
- case SERVICE_CONTINUE_PENDING:
- status=4;
- break;
- case SERVICE_PAUSE_PENDING:
- status=5;
- break;
- case SERVICE_PAUSED:
- status=6;
- break;
- }//end switch
- }else
- status=7;
- //end if
- CloseServiceHandle(hService);
- }//end if
- CloseServiceHandle(hSCManager);
- }//end process
- //------------------------------------------------------------------------------
- // FONCTION : Status
- // DESCRIPTION : Renvoie le status de fonctionnement du service
- //-------------------------------------------------------------------------------
- string Cl_SVR::StatusSVR(){
- return getStatusString(status);
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : ChangeService
- // DESCRIPTION : Change le nom du service
- //-------------------------------------------------------------------------------
- void Cl_SVR::ChangeService(const char *s){
- service=s;
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : ChangePc
- // DESCRIPTION : Change le nom du pc
- //-------------------------------------------------------------------------------
- void Cl_SVR::ChangePc(const char * pc){
- nompc=pc;
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : NomPc
- // DESCRIPTION : Renvoie le nom du pc
- //-------------------------------------------------------------------------------
- string Cl_SVR::NomPc()const{
- return nompc;
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : Service
- // DESCRIPTION : Renvoie le nom du Service
- //-------------------------------------------------------------------------------
- string Cl_SVR::Service()const{
- return service;
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : Service_Stop
- // DESCRIPTION : Permet d'arreter le fonctionnement d'un service.
- //-------------------------------------------------------------------------------
- void Cl_SVR::Stop(){
- //Fait la liaison avec le process manager des services
- hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
- if (hSCManager !=0){
- //Connection avec le service
- hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
- if (hService !=0){
- bControlService = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus);
- if (bControlService != 0)
- status=0;
- //end if
- CloseServiceHandle(hService);
- }//End If
- CloseServiceHandle(hSCManager);
- }//End If
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : Service_Start
- // DESCRIPTION : Permet de demarrer un service.
- //-------------------------------------------------------------------------------
- void Cl_SVR::Start(){
- //Fait la liaison avec le process manager des services
- hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
- if (hSCManager !=0){
- //Connection avec le service
- hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
- if (hService !=0){
- bStartServices = StartService(hService,0,0);
- if (bStartServices != 0)
- status=3;
- //end if
- CloseServiceHandle(hService);
- }//End If
- CloseServiceHandle(hSCManager);
- }//End If
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : ReStart
- // DESCRIPTION : Permet de restarter un service
- //-------------------------------------------------------------------------------
- void Cl_SVR::ReStart(){
- //Fait la liaison avec le process manager des services
- hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
- if (hSCManager !=0){
- //Connection avec le service
- hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
- if (hService !=0){
- //stop du service
- bControlService = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus);
- //Boucle d'attente de l'arret
- do{
- bServiceStatus = QueryServiceStatus(hService,&ServiceStatus);
- }while(ServiceStatus.dwCurrentState != SERVICE_STOPPED);
- //end do
- status=0;
- cout << "Service '" << service << "' est en état " << StatusSVR() << endl;
- //start du service
- bStartServices = StartService(hService,0,0);
- //Boucle d'attente de demarrage
- do{
- bServiceStatus = QueryServiceStatus(hService,&ServiceStatus);
- }while(ServiceStatus.dwCurrentState != SERVICE_RUNNING);
- //end do
- status=3;
- cout << "Service '" << service << "' est en état " << StatusSVR() << endl;
- CloseServiceHandle(hService);
- }//End If
- CloseServiceHandle(hSCManager);
- }//End If
- }//end function
- //------------------------------------------------------------------------------
- // FONCTION : PsKill
- // DESCRIPTION : Renvoie le nom du Service
- //-------------------------------------------------------------------------------
- void Cl_SVR::PsKill(const char * proc){
- string cmd;
- cmd = "pskill -t " + nompc + " " + proc + " >log.txt";
- system(cmd.c_str());
- }//end function
-
- //------------------------------------------------------------------------------
- // FONCTION : PsKill
- // DESCRIPTION : Renvoie le nom du Service
- //-------------------------------------------------------------------------------
- string Cl_SVR::getStatusString(int nStatus){
- switch (nStatus){
- case 0: return "Stopped";
- case 1: return "Pending Start";
- case 2: return "Pending Stop";
- case 3: return "Running";
- case 4: return "Pending Continu";
- case 5: return "Pending Pause";
- case 6: return "Paused";
- default: break;
- }//end switch
- return "N\'exite pas";
- }//end function
-
- //------------------------------------------------------------------------------
- // START PROGRAM TEST
- //-------------------------------------------------------------------------------
- void main(){
- Cl_SVR p;
- cout << p.StatusSVR() << endl;
- p.Stop();
- cout << p.StatusSVR() << endl;
- // p.ReStart();
- // p.Start();
- // p.PsKill("Realmon.exe"); //Kill une application en mémoire(Seulement valable en local)
- // system("Realmon.exe"); //relance l'application en mémoire(Seulement valable en local)
-
- }//end programme
- //------------------------------------------------------------------------------
- // END PROGRAM TEST
- //-------------------------------------------------------------------------------
-
#include <windows>
#include <stdlib>
#include <iostream.h>
//--------------------------------------------------------
// DEBUT CLASSE SERVICE
//--------------------------------------------------------
class Cl_SVR {
protected:
string service;
string nompc;
int status;
SC_HANDLE hSCManager;
SC_HANDLE hService;
BOOL bServiceStatus;
BOOL bControlService;
BOOL bStartServices;
SERVICE_STATUS ServiceStatus;
void Status();
string getStatusString(int);
public: // Les données et les méthodes publiques.
Cl_SVR();
Cl_SVR(const char *,const char *);
~Cl_SVR();
string StatusSVR();
void ChangeService(const char *);
void ChangePc(const char *);
string NomPc()const;
string Service()const;
void Stop();
void Start();
void ReStart();
void PsKill(const char *);
};
//--------------------------------------------------------
// FIN CLASSE SERVICE
//--------------------------------------------------------
//------------------------------------------------------------------------------
// FONCTION : Constructeur
// DESCRIPTION : Initialisation par défaut
//-------------------------------------------------------------------------------
Cl_SVR::Cl_SVR(): service("inort"), nompc("\\\\"){
nompc+=getenv("COMPUTERNAME");
Status();
}//end procedure
//------------------------------------------------------------------------------
// FONCTION : Constructeur
// DESCRIPTION : Initialisation par défaut
//-------------------------------------------------------------------------------
Cl_SVR::Cl_SVR(const char * s,const char * pc): service(s), nompc("\\\\"){
nompc+=pc;
Status();
}//end procedure
//------------------------------------------------------------------------------
// FONCTION : Destructeur
// DESCRIPTION : Destruction de l'objet
//-------------------------------------------------------------------------------
Cl_SVR::~Cl_SVR(){
}//end procedure
//------------------------------------------------------------------------------
// FONCTION : Service_Status
// DESCRIPTION : Permet de savoir le status de fonctionnement du service
// RUNNING,STOOPED,PAUSE,PENDING,etc....
//-------------------------------------------------------------------------------
void Cl_SVR::Status(){
//Fait la liaison avec le process manager des services
hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager !=0){
hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
//Connection avec le service
if (hService !=0){
//Demande le status du service
bServiceStatus = QueryServiceStatus(hService,&ServiceStatus);
switch(ServiceStatus.dwCurrentState){
case SERVICE_STOPPED:
status=0;
break;
case SERVICE_START_PENDING:
status=1;
break;
case SERVICE_STOP_PENDING:
status=2;
break;
case SERVICE_RUNNING:
status=3;
break;
case SERVICE_CONTINUE_PENDING:
status=4;
break;
case SERVICE_PAUSE_PENDING:
status=5;
break;
case SERVICE_PAUSED:
status=6;
break;
}//end switch
}else
status=7;
//end if
CloseServiceHandle(hService);
}//end if
CloseServiceHandle(hSCManager);
}//end process
//------------------------------------------------------------------------------
// FONCTION : Status
// DESCRIPTION : Renvoie le status de fonctionnement du service
//-------------------------------------------------------------------------------
string Cl_SVR::StatusSVR(){
return getStatusString(status);
}//end function
//------------------------------------------------------------------------------
// FONCTION : ChangeService
// DESCRIPTION : Change le nom du service
//-------------------------------------------------------------------------------
void Cl_SVR::ChangeService(const char *s){
service=s;
}//end function
//------------------------------------------------------------------------------
// FONCTION : ChangePc
// DESCRIPTION : Change le nom du pc
//-------------------------------------------------------------------------------
void Cl_SVR::ChangePc(const char * pc){
nompc=pc;
}//end function
//------------------------------------------------------------------------------
// FONCTION : NomPc
// DESCRIPTION : Renvoie le nom du pc
//-------------------------------------------------------------------------------
string Cl_SVR::NomPc()const{
return nompc;
}//end function
//------------------------------------------------------------------------------
// FONCTION : Service
// DESCRIPTION : Renvoie le nom du Service
//-------------------------------------------------------------------------------
string Cl_SVR::Service()const{
return service;
}//end function
//------------------------------------------------------------------------------
// FONCTION : Service_Stop
// DESCRIPTION : Permet d'arreter le fonctionnement d'un service.
//-------------------------------------------------------------------------------
void Cl_SVR::Stop(){
//Fait la liaison avec le process manager des services
hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager !=0){
//Connection avec le service
hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
if (hService !=0){
bControlService = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus);
if (bControlService != 0)
status=0;
//end if
CloseServiceHandle(hService);
}//End If
CloseServiceHandle(hSCManager);
}//End If
}//end function
//------------------------------------------------------------------------------
// FONCTION : Service_Start
// DESCRIPTION : Permet de demarrer un service.
//-------------------------------------------------------------------------------
void Cl_SVR::Start(){
//Fait la liaison avec le process manager des services
hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager !=0){
//Connection avec le service
hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
if (hService !=0){
bStartServices = StartService(hService,0,0);
if (bStartServices != 0)
status=3;
//end if
CloseServiceHandle(hService);
}//End If
CloseServiceHandle(hSCManager);
}//End If
}//end function
//------------------------------------------------------------------------------
// FONCTION : ReStart
// DESCRIPTION : Permet de restarter un service
//-------------------------------------------------------------------------------
void Cl_SVR::ReStart(){
//Fait la liaison avec le process manager des services
hSCManager = OpenSCManager(nompc.c_str(),NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager !=0){
//Connection avec le service
hService = OpenService(hSCManager,service.c_str(),SERVICE_ALL_ACCESS);
if (hService !=0){
//stop du service
bControlService = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus);
//Boucle d'attente de l'arret
do{
bServiceStatus = QueryServiceStatus(hService,&ServiceStatus);
}while(ServiceStatus.dwCurrentState != SERVICE_STOPPED);
//end do
status=0;
cout << "Service '" << service << "' est en état " << StatusSVR() << endl;
//start du service
bStartServices = StartService(hService,0,0);
//Boucle d'attente de demarrage
do{
bServiceStatus = QueryServiceStatus(hService,&ServiceStatus);
}while(ServiceStatus.dwCurrentState != SERVICE_RUNNING);
//end do
status=3;
cout << "Service '" << service << "' est en état " << StatusSVR() << endl;
CloseServiceHandle(hService);
}//End If
CloseServiceHandle(hSCManager);
}//End If
}//end function
//------------------------------------------------------------------------------
// FONCTION : PsKill
// DESCRIPTION : Renvoie le nom du Service
//-------------------------------------------------------------------------------
void Cl_SVR::PsKill(const char * proc){
string cmd;
cmd = "pskill -t " + nompc + " " + proc + " >log.txt";
system(cmd.c_str());
}//end function
//------------------------------------------------------------------------------
// FONCTION : PsKill
// DESCRIPTION : Renvoie le nom du Service
//-------------------------------------------------------------------------------
string Cl_SVR::getStatusString(int nStatus){
switch (nStatus){
case 0: return "Stopped";
case 1: return "Pending Start";
case 2: return "Pending Stop";
case 3: return "Running";
case 4: return "Pending Continu";
case 5: return "Pending Pause";
case 6: return "Paused";
default: break;
}//end switch
return "N\'exite pas";
}//end function
//------------------------------------------------------------------------------
// START PROGRAM TEST
//-------------------------------------------------------------------------------
void main(){
Cl_SVR p;
cout << p.StatusSVR() << endl;
p.Stop();
cout << p.StatusSVR() << endl;
// p.ReStart();
// p.Start();
// p.PsKill("Realmon.exe"); //Kill une application en mémoire(Seulement valable en local)
// system("Realmon.exe"); //relance l'application en mémoire(Seulement valable en local)
}//end programme
//------------------------------------------------------------------------------
// END PROGRAM TEST
//-------------------------------------------------------------------------------
Conclusion
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Cl_SVR.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland pas d'erreur de compilation
Historique
- 02 juin 2006 22:14:30 :
- Correction du code source suivant les bonnes
remarques de excrt. J'espère qu'il sera content.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
C - WIN32 API - [ par philip63 ]
Bonjour,Mon service tourne sousW2k en Local System; il est non-interactif (Service-0x0-3e7$\Default). Aprés avoir testé l'absence du Shell par defaut
DDK et service. [ par deck_bsd ]
Yop à tous,Voila je travail sur un service que j'avais codé sous XP et qui fait un acces à la registry avec les API Reg... et qui biensur ne fonctionn
comment executer une fonction toutes les 3secondes [ par 3xodiuS ]
Bonjour,j'essaie de un service windows qui cache la barre des taches. Cependant losrque je l'executais, des fois elle revenais toute seule, donc j'ai
crypter ou cacher appel aux api [ par jb212121 ]
Bonsoir,J'aimerai savoir s' il est possible de crypter ou de cacher l'appel d'une apiMerci
CreateRemoteThread [ par draluorg ]
Salut a tous,J'essai d'appeler une fonction dans un autre process en utilisant CreateRemoThread mais j'ai quelques problemes.En fait, j'ai aucun probl
Treeview API WINDOWS [ par lektrosonic ]
Bonjour,je code en C et en API Windows une applicationJ'ai un treeview et je voudrais mettre a jour le texte de un de ses elements sans le supprimer.J
Affichage selection d'un listview quand il n'a pas le focus [ par hwoarang ]
Bonjour,J'ai cherché sur internet mais je n'ai pas reussi a trouver comment, avec l'API windows (en C). En C++, j'ai trouvé le membre HideSelection qu
treeview API windows [ par lektrosonic ]
Bonsoir, en C et avec api windows..je souhaite modifier le texte d un element d un treeview sans le supprimer.j'ai esseye le message TVM_SETITEM mais
service et base de donnee reseaux [ par gamemonde ]
oui bonjourj<ai creer un service windows et je dois me connecter a l'aide de ado sur une base de donnee d<un autre reseauxl<orsque c<est u
Icones et service [ par albanovisch ]
Bonjour, je cherche à savoir quel est le message envoyé par Windows pour indiquer qu'un utilisateur c'est logé sur le poste.Voila j'ai déclaré un serv
|
Derniers Blogs
WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui l'ont sagement suivi. Je profite de ce poste pour fai...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVéTECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVé par ROMELARD Fabrice
Speaker : Guillaume Rochette Cette session est dédiée à fournir le retour sur la mise en place d'un cloud privé (IaaS) par Osiatis pour son compte ou celui de ses clients. Ce projet s'est déroulé sur 4 mois et a permis de faire évoluer...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|