Bonjour à tous
J'ai récupéré cette valeur depuis 'Informations système':
Je veux récupérer cette même valeur à l'aide d'un code Lazarus si c'est possible.;)Code:Version du BIOS/Date LENOVO CCCN12ww(1.01),23-03-15
merci pour votre aide.
Version imprimable
Bonjour à tous
J'ai récupéré cette valeur depuis 'Informations système':
Je veux récupérer cette même valeur à l'aide d'un code Lazarus si c'est possible.;)Code:Version du BIOS/Date LENOVO CCCN12ww(1.01),23-03-15
merci pour votre aide.
Sous Windows, la version et la date du BIOS sont stockés dans le registre (HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System, clés SystemBiosVersion et SystemBiosDate).
Exemple de code:
Si tu es sous un Windows 64 bits, il faut remplacerCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 uses ... registry... var SystemBiosDate: string=''; SystemBiosVersion: string=''; Registry: TRegistry; begin Registry := TRegistry.Create; try // Navigate to proper "directory": Registry.RootKey := HKEY_LOCAL_MACHINE; if Registry.OpenKeyReadOnly('\HARDWARE\DESCRIPTION\System') then SystemBiosDate:=Registry.ReadString('SystemBiosDate'); //read the value of the default name SystemBiosVersion:=Registry.ReadString('SystemBiosVersion'); //read the value of the default name finally Registry.Free; end; end;
parCode:Registry := TRegistry.Create;
Trouvés dans la doc de fcl (http://wiki.freepascal.org/fcl-registry)Code:Registry := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
sous Linux, je ne sais...
Bonjour
Merci pour la réponse
J'ai un W7 32 et un Laz1.6
Pour le champ 'SystemBiosDate' il est récupéré sans aucun problème, mais pour le champ 'SystemBiosVersion' un message d'erreur est affiché:
MerciCitation:
Invalid registry data type: "SystemBiosVersion"
à l'adresse 544B7D
Bonjour
Le code suivant s'exécute sans erreurs mais le ShowMessage(SystemBiosVersion) est affiché à blanc.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 procedure TForm1.Button1Click(Sender: TObject); var SystemBiosDate: string; SystemBiosVersion: Ansistring; Registry: TRegistry; begin Registry := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); try // Navigate to proper "directory": Registry.RootKey := HKEY_LOCAL_MACHINE; if Registry.OpenKeyReadOnly('\HARDWARE\DESCRIPTION\System') then SystemBiosDate:=Registry.ReadString('SystemBiosDate'); //read the value of the default name SystemBiosVersion:=Registry.ReadString(SystemBiosVersion); //read the value of the default name finally showmessage(SystemBiosVersion); Registry.Free; end; end;
T'as pas l'impression qu'il manque un begin... end; quelque part pour que les deux ReadString soient pris en compte ?
Plus peut-être des simples quotes (ReadString sans simplequoter la string à la seconde ligne je trouve ça bizarre alors que la première ligne est simplequotée... Suis d'ailleurs étonné qu'il n'y ait pas de message d'erreur, mais je réponds sans faire aucun test, j'ai autre chose sur le gaz...)
@Jipété
ce n'est pas ça la cause.
On a deux variable 'SystemBiosDate' est reconnue par le système
alors que 'SystemBiosVersion' ne l'est pas 8O
C'est normal (enfin, sur ma vieille machine XP -- mais je ne vois pas pourquoi les choses auraient changé), car 'SystemBiosVersion' n'est pas une Ansistring comme tu l'as déclaré, mais une REG_MULTI_SZ un peu plus compliquée à lire.
Fais une recherche sur ce mot.
Et mets les simple quotes : tu peux faire un essai avec Identifier qui est une bête string comme SystemBiosDate, tu verras qu'il les faut.
Et tu as juste de la chance si tu ne protèges pas ton "if" avec begin... end, de la chance, c'est tout.
Chez moi, les 2 n'ont pas le même type : BiosDate est une chaîne AZT (REG_SZ), mais BiosVersion est un tableau de chaînes AZT (REG_MULTI_SZ). Cela peut-il avoir une influence ?
dans ce cas comment déclarer le type de SystemBiosVersion?
Bonjour
Il paraît que la définition du type De SystemBiosVersion n'est pas aussi évident.
Bon je peux utiliser uniquement la variable SystemBiosDate, mais reste à savoir si cette valeur
ne change pas avec un nouveau formatage de disque dur. si c'est le cas alors le problème est résolu.:P
quelques idées?
hello,
il y a aussi la possibilité de lire ces informations en utilisant le WMI.
Ami calmant, J.P
Bonjour Ami calmant
Pourras-tu nous faire plaisir de nous donner un petit exemple? :P
En pièce jointe utilwmi.pas qui contient la fonction GetWMIInfo. Attention cette version 0.3 est expérimentale car j'ai du faire une modification pour gérer le cas où le WMI retourne un tableau de valeurs (cas avec BIOSVersion). Dans ce cas je concatène tous les éléments en une seule chaîne avec | comme séparateur.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 uses utilwmi, contnrs; ********************************** var WMIResult : TFPObjectList; f,j : integer; retVal : String; begin WMIResult := GetWMIInfo('Win32_BIOS', ['BIOSVersion', 'Manufacturer']); for f := 0 to Pred(WMIResult.Count) do begin j := 0; // first entry = BiosVersion Infos retVal := TStringList(WMIResult[f]).ValueFromIndex[j]; Memo1.Lines.add(Retval); j := 1; // second entry = Manufacturer retVal := TStringList(WMIResult[f]).ValueFromIndex[j]; Memo1.Lines.add(Retval); end;
Bonsoir JP
Good work MAN :plusser:
Pièce jointe 229150
merci beaucoup.
hello,
la version officielle de utilwmi se trouve ici . Je me suis embêté pour rien :furieux: car il existait déjà une version 0.3 qui traitait les tableaux de variants (une modification à Molly ). Dans la version officielle, en entête du fichier la licence a été ajoutée qui est de type MIT. Ce type de licence est très libre et consiste en gros à dire que l'on peut faire ce que l'on veut avec le fichier à condition que le copyright et l'énoncé de la licence soit toujours gardés dans le fichier. Attention dans le forum où se trouve la version officielle de utilwmi, il faut être "enregistré" pour pouvoir voir ou télécharger les pièces jointes.
Ami calmant, J.P
Bonjour JP
Merci pour ces codes très intéressants.
J'utilise le code suivant afin de générer une chaîne unique pour chaque machine (pour la sécurisation de mon produit).
cependant le code suivant:
// uses Utilwmi,contnrs;
a dupliqué quelques informations du BIOS:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 procedure TForm1.Button1Click(Sender: TObject); const Txt1='GUID/GUID.INI'; var retVal1,GUI:String;ifOut:TextFile; WMIResult: TFPObjectList; f,j:integer; begin AssignFile(ifOut, Txt1); rewrite(ifOut); WMIResult := GetWMIInfo('Win32_BIOS', ['BIOSVersion', 'Manufacturer']); for f := 0 to pred(WMIResult.Count) do begin j := 0; retVal1 := TStringList(WMIResult[f]).ValueFromIndex[j]; end; GUI:=retval1; if length(retVal1)>36 then // les deux lignes que GUI:=Trim(Copy(retVal1,1,37)); // j'ai ajouté pour tronquer la chaîne writeln(ifOut,GUI); CloseFile(ifOut);
donc j'étais obligé d'ajouter deux lignes de codes pour tronquer la chaîne, ce qu'a donné le résultat suivant:Code:TOSASU - 100|InsydeH2O Version 03.72.301.10|InsydeH2O Version 03.72.301.10|InsydeH2O Version 03.72.301.10
mais ce que je veux savoir est si cette chaîne ne change pas même après un nouveau formatage de disque dur.Code:TOSASU - 100|InsydeH2O Version 03.72.
hello,
je ne vois pas pourquoi les chaînes changeraient après formatage ou remplacement du disque dur. Les informations BIOS sont liées à la carte mère et normalement seuls un changement de carte mère ou une mise à jour du BIOS peuvent faire changer ces données.
Ami calmant, J.P
@ JP
Donc mon problème est résolu :P
merci JP :plusser: