GESTION DES SERVICES WINDOWS PAR LES API DANS UNE CLASSE

excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006 - 2 juin 2006 à 17:49
Micky0001 Messages postés 1 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 2 juin 2009 - 2 juin 2009 à 21:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37912-gestion-des-services-windows-par-les-api-dans-une-classe

Micky0001 Messages postés 1 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 2 juin 2009
2 juin 2009 à 21:23
je sais ca deterre mais il y a un probleme
ne pas oublier le using namepsace std;
sinon ca fais tt foirer ^^
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 juin 2006 à 20:28
C'est très clair, la compil ok indique seulement que la syntaxe du langage est correcte, que le prog ne plante pas est une toute autre affaire.
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
2 juin 2006 à 17:59
dernière petite chose

BOOL hServiceStatus;
BOOL hControlService;
BOOL hStartServices;

« h » désigne un « HANDLE », pas un BOOL

BOOL bServiceStatus;
BOOL bControlService;
BOOL bStartServices;
// serait plus ... approprié

// ton code
hServiceStatus = QueryServiceStatus( ... );

quand on lit ca, on ce dit, ah! QueryServiceStatus() retourne un « HANDLE », mais non! c'est faux! QueryServiceStatus() retourne un « BOOL » !
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
2 juin 2006 à 17:50
en passant, retire cette phrase « pas d'erreur de compilation »
je ne veux pas être méchant mais c'est ridicule puisque
« 0 error(s), 0 warning(s) » ne veut strictement _rien_ dire ...
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
2 juin 2006 à 17:49
pour la Xeme fois

#include <stdlib.h> // C
#include <cstdlib> // C++
#include // BAD! sans .h << cette version est obsolète(elle existe encore pour une raison de compatibilité avec de ~vieux programmes)
#include // GOOD

ta gestion des chaines de caractères est _Complètement_ nulle

Cl_SVR::Cl_SVR(){
service="\0"; // c'est un char*, pas d'allocation mémoire ni rien d'autre du genre
strcat(service,"inort"); // ca va faire !!!CABOUME!!!
nompc="\\\"; strcat(nompc,getenv("COMPUTERNAME")); // ca aussi!
Status();
}//end procedure

pourquoi est-ce que tu n'utiliserais pas les basic_string hein?

#include <string>

class Cl_SVR
{
// ...
string service;
string nompc;
// ...
};

Cl_SVR::Cl_SVR() : service("inort"), nompc("\\\")
{
nompc += getenv("COMPUTERNAME");
Status();
}//end procedure

Cl_SVR::Cl_SVR(const char * s,const char * pc) : service(s), nompc("\\\")
{
nompc += pc;
Status();
}//end procedure

service.c_str() pour obtenir un pointeur sur la chaine

const char* c_str() const {
return un_pointeur_sur_la_chaine;
}


etc...
etc...
etc...

void Cl_SVR::PsKill(const char * proc)
{
//char * cmd = new (char[100]);
char cmd[100+1]; // si tu ne veux pas libérer la mémoire alors pas de « new » !
snprintf(cmd, 100, "pskill -t %s %s >log.txt", nompc, proc);
//strcpy(cmd,"\0");
//strcat(cmd,"pskill -t ");
//strcat(cmd,nompc);
//strcat(cmd," ");
//strcat(cmd,proc);
//strcat(cmd," >log.txt");
system(cmd);
}//end function

Je suis désolé de te le dire mais ton code n'est pas bon, mais pas du tout!
Va reviser la « Gestion Des Chaînes De Caractères » !!!

si tu utilise un « char* », tu dois lui assigner/allouer de la _Mémoire_
tu ne peux pas manipuler ton pointeur, qui, pointe sur _Rien_ !

sinon, comme j'ai dit plus haut, utilise basic_string >> #include <string>
avec basic_string, pas besoin de t'occuper de la gestion de la mémoire, basic_string le fait tout seul comme un grand!

autre petite chose, pour le « status », utilise un entier quelconque pour connaître le status et non une chaine, avec un entier ca serait tellement plus simple/rapide/... et surtout, beaucoup mais beaucoup moins lourd à gérer. si tu tiens absolument a obtenir le status en « texte », ajoute une simple/petite/... fonction qui va te retourner le status(en texte)

const char* getStatusString(int nStatus)
{
switch (nStatus)
{
case X: return "status X";
case Y: return "status Y";
// ...
default: break;
}
return "unknown status";
}


...
...
...
Rejoignez-nous