Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
697 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C / C++] Lire informations disque dur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C / C++] Lire informations disque dur

n°2155548
Jitech
Posté le 04-09-2012 à 18:35:10  profilanswer
 

Bonjour,
 
Quelqu'un connaitrait-il le moyen de lire les informations relatives au disque dur comme le fait CrystalDiskInfo (nombre d'allumage, temps de fonctionnement, numéro de série etc) en C ou C++ ? Je suis sous Windows XP.
 
En fait je souhaite exécuter un programme à chaque allumage de mon PC. Le problème est que ce programme doit être lancé à chaque mise sous tension or lors d'une reprise de veille prolongée je dois relancer le programme manuellement.
 
Mon idée est donc de faire un programme qui vérifie toutes les minutes si le nombre d'allumages du disque dur a augmenté et qui dans ce cas là lance un .exe via une commande système.
 
Merci.

mood
Publicité
Posté le 04-09-2012 à 18:35:10  profilanswer
 

n°2155679
gilou
Modérateur
Modzilla
Posté le 05-09-2012 à 14:06:45  profilanswer
 

Le seul endroit ou j'ai trouvé du code pour accéder aux infos S.M.A.R.T. est ici: http://www.codeproject.com/Article [...] -S-M-A-R-T
Le code intéressant est dans le fichier SmartReader.cpp
A+,


Message édité par gilou le 05-09-2012 à 14:10:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2155720
Jitech
Posté le 05-09-2012 à 16:29:13  profilanswer
 

Merci beaucoup :)  
 
Je devrais pouvoir faire ce dont j'ai besoin avec ça :jap:

n°2155735
theshockwa​ve
I work at a firm named Koslow
Posté le 05-09-2012 à 18:07:54  profilanswer
 

Je ne sais pas pourquoi, mais quand tu décris ton besoin, j'ai l'impression que c'est une solution overkill et qu'il doit forcément y avoir une fonctionnalité du système pour t'aider à faire ca.


---------------
last.fm
n°2155755
Jitech
Posté le 05-09-2012 à 21:20:59  profilanswer
 

J'ai également cette impression.
En fait j'avais déjà créé un topic ici mais apparemment personne n'avait de solution.
J'ai donc pensé à cette approche qui peut sembler disproportionnée.

n°2155841
bjone
Insert booze to continue
Posté le 06-09-2012 à 10:56:36  profilanswer
 

Pitètre en powershell/vbs (mm xp :??:) utilisant le WMI
http://powershell.com/cs/forums/t/8595.aspx
http://msdn.microsoft.com/en-us/wi [...] 63395.aspx


Message édité par bjone le 06-09-2012 à 10:58:41
n°2155844
gilou
Modérateur
Modzilla
Posté le 06-09-2012 à 11:02:46  profilanswer
 

Une approche plus simple, mais nécessitant aussi d'écrire un programme Windows:
 
- faire une appli windows qui fasse un appel à RegisterPowerSettingNotification pour demander à recevoir un message WM_POWERBROADCAST (cf aussi ceci)
- Si c'est pour Windows 8 seulement, il y a maintenant la fonction PowerRegisterSuspendResumeNotification
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2155847
breizhbugs
Posté le 06-09-2012 à 11:40:28  profilanswer
 

Sous windows 7, on devrait s'en sortir avec le planificateur de taches non? Je ne sais pas ce qu'il vaut sous XP par contre....


---------------
Seul Google le sait...
n°2156017
Jitech
Posté le 08-09-2012 à 04:45:33  profilanswer
 

Ça y est j'ai réussi !
 
Tout d'abord j'ai installé S.M.A.R.T. Monitoring Tools afin d'ajouter la commande smartctl qui permet d'afficher les informations S.M.A.R.T dans la console.
 
J'ai ensuite écrit un programme qui récupère le résultat de la commande dans un fichier. Il me suffit ensuite de vérifier à intervalle régulier si le nombre de mise sous tension (Power_Cycle_Count) a augmenté.
 
Voici le code pour ceux que ça intéresse :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. int main()
  6. {
  7.     char buffer1[128], buffer2[128];
  8.     int i;
  9.     FILE *pPipe;
  10.     HWND hwnd = GetForegroundWindow();
  11.     ShowWindow(hwnd, SW_HIDE); //on cache la console
  12.     buffer1[0] = '\0';
  13.     while(1)
  14.     {
  15.         if( (pPipe = _popen("smartctl -A sda", "r" )) == NULL ) exit(1); //on récupère le résultat de la commande
  16.         for(i=0; i<17; i++) fgets(buffer2, 128, pPipe); //on récupère la ligne qui nous intéresse
  17.         if(strcmp(buffer1, buffer2) < 0) //l'ordinateur a été redémarré
  18.         {
  19.             strcpy(buffer1, buffer2);
  20.             system("C:/SetFSB/Tools/AutoToolOC_ON.exe" );
  21.         }
  22.         _pclose(pPipe);
  23.         Sleep(60000);
  24.     }
  25.     return 0;
  26. }


 
La reprise de veille et la reprise de veille prolongée sont parfaitement détectées. [:never let me down]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C / C++] Lire informations disque dur

 

Sujets relatifs
int16_t[400] et char[400] xor en C[C][reseau] connection tcp (3 voies) raw socket
Temporisation - Langage C - Launchpad MSP430Ajouter informations Base de données
[XCode/Objective C] Que fais la fonction appendFormat?Fonction: C
[C]Extraire un chiffre d'un tableau de char dans un int[C#] Service Windows et méthode static d'une dll précompilée [Résolu]
[C#] Génération de rapport PDF[C#] Déploiement d'AddIn Office (vsto), manifest et signature.
Plus de sujets relatifs à : [C / C++] Lire informations disque dur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR