je suis vraiment bloqué aide moi sat83 stp !c'est tout ce qui reste comme probléme pour enfin finaliser mon ptit projet !
je suis vraiment bloqué aide moi sat83 stp !c'est tout ce qui reste comme probléme pour enfin finaliser mon ptit projet !
Ben tu as plusieurs solution :
- Soit tu utilise la fonction ScanDirectory uniquement pour générer une liste de fichier, et ensuite tu travaille sur cette liste de fichier
- Soit tu utilise directement la fonction ScanDirectory.
L'avantage de la première méthode c'est que c'est plus simple, le désavantage c'est que tu va parcourir 2 fois la liste de fichier.
As-tu deja fais ta fonction qui calcul le MD5 d'un fichier? Montre voir a quoi elle ressemble pour pouvoir l'integrer dans la suite
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
je t'ecplique d'une autre maniére:
souviens toi tu m'a donné les fichiers (md5 et md5wrapper) puis tu ma donné le code
ce code que tu m'a donné permet de calculer le hash d'un seul fichier seulemnt (dans mon example c'est monfichier1.exe)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 md5wrapper *hashMd5 = new md5wrapper() ; std::string result = hashMd5->getHashFromFile( "C:\\monrep\\monfichier1.exe" ) ; ShowMessage( (AnsiString) result.c_str() ); delete hashMd5;
la fonction scanDirectory permet de lister les fichiers .exe de "monrep" c'est a dire que tous les fichiers présents dans "monrep" vont étre affichés.
au lieu de calculer le hash de 1 seul fichier , je veu calculer tous les fichiers de "monrep" (monfichier1.exe, monfichier2.exe ...)
je bloque dans la mondification du source !!
De mon coté j'ai réaliser un programme qui réalise a peut pret tout ce que tu veux faire, donc je prend les fonctions que j'ai faite chez moi :
Pour la fonction que je te demande depuis 20 messages on va dire que c'est celle-là:
Donc nulle part ailleurs tu aura besoin d'utiliser md5wrapper dans ton application (d'où l'intérêt de faire des fonctions!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 AnsiString MD5HashFile( AnsiString aFileName ) { if ( !FileExists(aFileName) ) return("") ; md5wrapper *hashMd5 = new md5wrapper() ; std::string result = hashMd5->getHashFromFile( aFileName.c_str() ) ; delete hashMd5; return( (AnsiString) result.c_str() ); }
Ensuite tu ne m'a toujours pas dis ce que tu souhaitais faire des hash, ni comment tu souhaitais les réaliser, ni dans quoi tu voulais les stocker.
Donc pour faire très simple on va dire que tu stocke les chemins des fichiers et les MD5 correspondant dans deux TStringList.
Declare 2 TStringList dans la section private de ton *.h :
Tu instancie (new) les deux TStringList dans le OnCreate de ta Form principale, et tu les detruit (delete) dans le OnDestroy de ta Form.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private: // Déclarations utilisateur TStringList *exeList, *md5List ;
Ensuite tu creer une methode du nom que tu veux dans ta classe (ici j'ajoute juste les infos dans la liste, mais tu peux très bien faite autre chose a la place) :
Et dans ScanDirectory comme je te l'avais expliqué tu as une seule ligne a changé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 AnsiString AddInList( AnsiString aFileName, AnsiString aMD5 ) { exeList->Add( aFileName ) ; md5List->Add( aMD5 ) ; }
Et donc dans un Button tu as juste a faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 void __fastcall ScanDirectory(AnsiString pmRep) { TSearchRec SearchRec; int Attributes = 0; AnsiString bcRep = "", bcRepTemp = "", bcFile = "", bcExt = ""; Attributes |= faAnyFile; bcRep = pmRep; if(bcRep[bcRep.Length()] != '\\') { bcRep+= "\\"; // ajout du slash final si il n'y est pas } bcRepTemp = bcRep; bcRep+= "*.*"; if(FindFirst(bcRep, Attributes, SearchRec) == 0) // on recherche TOUS les fichiers/dossiers { do { bcFile = SearchRec.Name; // on recupere le nom du fichier/dossier trouver if(bcFile != "." && bcFile != "..") //on filtre les repertoires '.' et '..' { bcFile = bcRepTemp + SearchRec.Name; bcExt = ExtractFileExt( bcFile ) ; // on recupere l'exstension du fichier if(SearchRec.Attr != faDirectory) { if (LowerCase(bcExt) == ".exe") // on test si c'est un executable { AddInList( bcFile, MD5HashFile( bcFile ) ) ; } } else { ScanDirectory(bcFile); // si c'est un repertoire, on "scan" ce repertoire } } } while (FindNext(SearchRec) == 0); // jusqu'a ce qu'il n'y ai plus de fichiers FindClose(SearchRec); // on ferme le TSearchRec } }
Et tu aura la liste des fichiers dans la première TStringList, et la liste des MD5 correspondant dans la deuxième.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void __fastcall TForm1::Button1Click(TObject *Sender) { ScanDirectory( "C:\\MonDossier\\" ) ; }
Je t'ai fait 99% du programme, avec ça si tu ne t'en sort pas je ne pourrait plus rien faire pour toi! Le but était que tu arrive a faire tout ca par étape et par toi même (c'est pour ça que je t'ai demandé d'écrire les fonctions l'une après l'autre en essayant d'y allé doucement).
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
j'ai fai comme ça mais lors de la compilation exeList, md5List ne sont pa définis
la mém choz pour le ondestroy, donc je pense que le probléme viens de la ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void __fastcall TForm1::FormCreate(TObject *Sender) { AddInList = new exeList; AddInList = new md5List; }
As tu deja manipuler des objets? Je pense que non! AddInList est une methode de classe, et exeList est un objet, autrement dit ce que tu a ecrit est un peu abberant!void __fastcall TForm1::FormCreate(TObject *Sender)
{
AddInList = new exeList;
AddInList = new md5List;
}
Voilà comme faire pour instancier/liberer un objet:
1) déclaration :
2) instanciation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part TMaClasse *monObjet
3) libération :
Code : Sélectionner tout - Visualiser dans une fenêtre à part monObjet = new TMaClasse(/*paramètres eventuels*/) ;
Ce qui donne dans le cas de TStringList :
Code : Sélectionner tout - Visualiser dans une fenêtre à part delete monObjet
A noter que la libération est très importante! Souvent lorsque qu'on débute en programmation, on oublie de libéré les objets que l'on a instancié, c'est une erreur grave! Tout objet instancié (avec new) doit etre absolument libéré (avec delete).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //Déclaration TStringList *exeList ; //instanciation exeList = new TStringList() ; //liberation delete exeList ;
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
merci sat83 pour toutes tes explications tu es un GRAND
si je compren bien l'instanciation se fera dan le OnCreat
la liberation dans le Ondetroy (sans oublier qu'il faut toujours liberer) !
Un GRAND merci a toi sat83, ça marche super bien, mais ( ya toujours un mais)
pour afficher le tout dans une listbox, un memo ou une valuelisteditor ça ne veut pas s'afficher. Et quand jutilise un Showmessage () ça s'affiche
Que me propose tu ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 void __fastcall ScanDirectory(AnsiString pmRep) { TSearchRec SearchRec; int Attributes = 0; AnsiString bcRep = "", bcRepTemp = "", bcFile = "", bcExt = ""; Attributes |= faAnyFile; bcRep = pmRep; if(bcRep[bcRep.Length()] != '\\') { bcRep+= "\\"; // ajout du slash final si il n'y est pas } bcRepTemp = bcRep; bcRep+= "*.*"; if(FindFirst(bcRep, Attributes, SearchRec) == 0) // on recherche TOUS les fichiers/dossiers { do { bcFile = SearchRec.Name; // on recupere le nom du fichier/dossier trouver if(bcFile != "." && bcFile != "..") //on filtre les repertoires '.' et '..' { bcFile = bcRepTemp + SearchRec.Name; bcExt = ExtractFileExt( bcFile ) ; // on recupere l'exstension du fichier if(SearchRec.Attr != faDirectory) { if (LowerCase(bcExt) == ".exe") // on test si c'est un executable { AddInList( bcFile, MD5HashFile( bcFile ) ) ; ShowMessage(bcFile+" = "+MD5HashFile (bcFile )); } } else { ScanDirectory(bcFile); // si c'est un repertoire, on "scan" ce repertoire } } } while (FindNext(SearchRec) == 0); // jusqu'a ce qu'il n'y ai plus de fichiers FindClose(SearchRec); // on ferme le TSearchRec } }
en tout cas je continue a faire des essai, si je trouve je te previens
Jai trouvé où été le probléme
il fallait rajouter TForm1::
Code : Sélectionner tout - Visualiser dans une fenêtre à part void __fastcall TForm1::ScanDirectory(AnsiString pmRep)
maintenant il fo que je créer une petite base de donnée pour stocker les signatures MD5 (ça sera comme tu me l'a dis une reference pour verifier par la suite), bon je suis pas tré fort en Base de Données mais je vais me débrouiller.
Je voulais te poser une question, je vais essayer d'étre clair :
** je voudrais que le checksum reference soit exécuté et enregistré une seule et unique fois lors de la toute premiére utilisation de mon application (je vais créer l'installable avec Installshield), puis les autres checksum se feront a la demande (avec un bouton) est-ce que c'est possible ??
** Une autre question qui me viens a l'ésprit comment faire pour défiler les fichier 'scanné' sur un label (si possible) et comment utiliser une progressbar (comme pour un vrai antivirus si tu vois ce que je veu dire) le label affiche tour a tour les fichiers scanné (soit-disons)
L'interet du programme que je t'ai fais, c'est que tous est stocké dans des List! Donc as tout moment tu peux accéder a ces listes pour éventuellement les enregistrer où tu veux...
Si tu veux les afficher pour vérifier éventuellement dans des ListBox :
Mais encore une fois n'ajoute pas de code dans ScanDirectory! A la limite des appels a des fonctions, c'est beaucoup plus propre!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ListBox1->Items->Assign( exeList ) ; ListBox2->Items->Assign( md5List ) ;
Par exmeple tu te creer une fonction :
void AfficherFichierActif(AnsiString aFileName)
{
Label1->Caption = aFileName ;
Application->ProcessMessage ;
}
et tu ajoute juste un appel a cette fonction dans ScanDirectory.
Pour la progressbar c'est impossible vu que tu n'a pas une taille fixe d'élément a scanner.
Mais si tu veux avancé commence a apprendre a manipuler les TStringList (tu trouvera des exmeple partour sur Internet) ce qui te permettra de manipuler tes listes d'exe et MD5.
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
Juste un petit souci dans mon application :
lorsque je scann tout mon disque ("C:\\") mon application se plante
y a-t-il un moyen de remedier a cela.
2 - est-il possible de trouver des signatures virales ?? (la signature d'un seul virus et suffisante) et si j'en trouve, est-ce que c'est facile de les ajouter a mon application ?
encore une éniéme question est-possible d'arreter le scan avec un bouton ??
Ton application se plante, c'est a dire?lorsque je scann tout mon disque ("C:\\") mon application se plante
Scanner un disque dur c'est long, ça peut prendre quelques minutes voir quelques dizaines de minutes, donc c'est peut etre normal... Mais tu peux ajouter un Application->ProcessMessage dans la boucle du ScanDirectory, ca permettra a ton application de ne pas être "figer" pendant l'exécution.
Pour arreter le Scan avec un bouton "STOP" c'est facile, tu utilise une variable booléene initialisée a false, et tu l'affecte à true dans la procédure de ton bouton Stop. Ensuite tu a juste a ajouter un test dans ScanDirectory et a sortir de la fonction si cette variable est a true.
Pour infos je ne serais pas là les prochains jours, donc essai d'avancer de ton coté en cherchant par toi même, et si tu a encore des questions ce week-end j'y repondrais...
Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager