C'est mon premier véritable logiciel programmé en C, un calculateur simple de hash de fichiers.
Après de longues recherches, j'ai mis au point ce logiciel qui permet de calculer les hash :
CRC16 CRC32 CRC64 Adler32 ELF32 FNV32 FNV64 Gost-Hash HAVAL-3-4-5 MD2 MD4 (ed2k) MD5 RIPEMD128 RIPEMD160 SHA1 SHA256 SHA384 SHA512 et Tiger
En réalisant des tests et en comparant avec d'autres logiciels de hash, je me suis aperçu que ReHash donnait un CRC64 différent du mien, alors pour ceux qui voudraient calculer avec la méthode ReHash, j'ai ajouté celle-ci (décommentez la ligne #define ___ReHash_Code___ dans "main.h").
C'est la version 1.1.1 prête à compiler avec Dev-C++ et Code::Blocks !
Aperçu :
http://ordiman85.free.fr/logiciels/index.php?page=shots
Source / Exemple :
/* Hash Finder v1.1.1.0
Explications du fonctionnement */
// Dans main.c :
// Inclusion des variables globales et des librairies à compiler pour les calculs et autres...
#include "main.h"
// Fonction principale
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// Copie de la ligne de commande (facultative) dans la 'string' LigneCommande qui est utilisable dans tout le code
// Ouverture de la fenêtre
// Boucle des évènements et des messages
}
// Callback principal
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE:
// Création des contrôles
// Gestion de la ligne de commande
// Si ligne de comande détectée, lance la fonction OuvertureFichier()
return 0;
case WM_COMMAND:
// Détecte les évènements liés aux contrôles :
// Si l'utilisateur appuie sur Parcourir, ça ouvre une mini-fenêtre de sélection
// S'il appuie sur Calculer, ça lance la fonction OuvertureFichier()
// Si le bouton Calculer était tranformé en bouton Annuler, termien simplement le calcul (lance AnnulerCalcul(1))
// S'il appuie enfin sur la case à cocher Afficher en majuscules... lance Change_Majuscules();
return 0;
case WM_DROPFILES:
// Le champ du nom de fichier est modifié en faisant un glisser-déposer
return 0;
case WM_DESTROY:
PostQuitMessage(0); // Si la fenêtre est sur le point d'être détruite
return 0;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam); // Réponse par déaut
}
}
// Callback lancée par le timer Windows
VOID CALLBACK ProgressProc(HWND hwnd, UINT uMsg, UINT_PTR Type, DWORD dwTime) {
// Met à jour la barre de progression en arrière-plan
}
// Tout dans le titre...
char OuvertureFichier(char* Fichier) {
// Vérifie l'existence du fichier
// Si le fichier existe, l'ouvre et lance InitHash
// Sinon affiche une box d'erreur
}
// Initialisation du calcul
void InitHash() {
// Met les contextes hash à zéro
// Modifie le texte des contrôles (Calculer devient Annuler...)
// Lance le timer Windows pour éxécuter ProgressProc();
// Lance le thread HashProc();
}
// Fonction de calcul
void HashProc() {
// Effectue les opérations propres à chaque hash (boucle -> lecture fichier -> MAJ calcul -> et hop ça repart!)
// Une fois la lecture finie, lance FinalHash();
// A là fin lance AnnulerCalcul(0) pas pour annuler mais pour remettre les contrôles comme à l'initial
}
// Finalisation du calcul
void FinalHash() {
// Effectue des manips propres à chaque hash (switch)
// Place le hash en hexadécimal dans le variable globale
// Lance AnnulerCalcul(0);
// Met à jour le champ textuel du hash en lançant Change_Majuscules();
}
// RAZ des contrôles
void Annuler_Calcul(char Annuler) {
// Si Annuler == 1, affiche "opération annulée"
// Sinon, rien
// Et enfin RAZ des contrôles, fin du timer, fermeture du fichier si ouvert.
}
// MAJ du champ du hash
void Change_Majuscules() {
// Et en majuscules à l'occasion si l'utilisateur l'a choisi
}
Conclusion :
J'ai été étonné que la barre de progression se soit affichée en utilisant CreateWindow() alors que je n'ai mis aucun '#include <commctrl.h>' et aucun InitCommonCtrl ou un truc du genre, alors qu'en faisant une appli toute simple avec une barre de progression dans une petite fenêtre, pas moyen de l'afficher !!
Je voudrais demander aux programmeurs expérimentés si un Sleep() est nécéssaire...
La dernière version sera toujours ici :
http://ordiman85.free.fr/logiciels/index.php?page=download
@+
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.