FILE INFO

draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010 - 24 août 2006 à 14:11
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 - 1 août 2007 à 11:51
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/39252-file-info

blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
1 août 2007 à 11:51
Bonjour,

Je viens de lire le code et les différents commentaires. A priori vous savez de quoi vous parlez. Alors j'ai essayé les 2 versions de code.

Le premier semble ne pas récupérer les infos sur les fichiers .exe, mais j'avoue ne pas avoir rechercher pourquoi.

Sur le second, il y a la déclartion VS_FIXEDFILEINFO. Quézako ?

Merci d'avance de vos réponses.
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
2 sept. 2006 à 17:35
Salut Mad,

Eh bin en fait j'ai juste fais prog de listage des modules en cours pour tester mon module FileInfo dans les meme conditions que vous pour voir si ca marchait ou pas et je n'ai rencontre aucune erreur... donc apparement c'est bon...

++
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
2 sept. 2006 à 15:41
Hey hey, je rentre de vacances alors j'ai pas pu suivre le feuilleton ^^
Alors finalement, vous l'avez encore ce bug ? Moi perso je l'ai plus (avec le code que j'ai mis en commentaire, et je peux vous l'envoyer en complet si vous voulez)
Et apparement on est tous les 3 autour des meme genres de prog lol
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
31 août 2006 à 17:40
D'accord, tu créé d'abord la liste, et ENSUITE tu remplis la ListView.... Ok, j'ai compris ^_-
Parceque moi je remplis la moitié des infos sur le tas, donc on voit la ListView se remplir au fur et à mesure (d'où l'utilisation de ValidateRect pour éviter çà).

Concernant les sources, c'est vraiment sympa de me le proposer, mais je sais ce que c'est que de "nettoyer" une source pas très propre ^^ Ne te donne pas cette peine !

En tout cas, merci beaucoup, @+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
31 août 2006 à 17:36
<toutes les lignes de texte apparaissent en même temps (composant vierge, puis plein d'un coup) et non à la suite ? Comment as tu fait ?>

Eh en fait j'ai cree une fonction qui me renvoi un tableau avec tous les fileInfo de chaque modules (exe ou dll) et puis j'ajoute tout a la lsite d'un coup...(enfin en une boucle)

Je te filerais bien les sources, mais la elles sont a l'etat de brouillons, donc c'est le bordel, si tu veux je nettoie un peu ca et je te file les sources ?

++
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
31 août 2006 à 14:45
Euh oui, c'est pour geler et dégeler l'affichage d'un ListView (en particulier).
Mais dans le *.exe, toutes les lignes de texte apparaissent en même temps (composant vierge, puis plein d'un coup) et non à la suite ? Comment as tu fait ?

Et en effet, même si les autres infos ne sont pas affichées mais quand même récupérées, le programme aurait du planter si il y avait un problème quelconque.
@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
31 août 2006 à 14:42
re,

Eh non je n'utilise pas ces api, qui n'ont rien avoir avec les processus ou les fichiers, il servent a raffraichir une fenetre non ?

Sinon je n'affiche dans cet exemple que FileDescription et Companyname, mais je recupere les autres aussi...
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
31 août 2006 à 14:15
Effectivement, çà marche chez moi aussi. Bizarre. Je vais essayer d'extraire uniquement les infos copyright/description/version et alléger la fonction pour voir si j'ai encore le bug...


PS : dans ton exécutable, tu utilises les APIs ValidateRect et InValidateRect ?

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
31 août 2006 à 14:11
re,

tien bizare, j'ai justement fait pareil hier pour tester et je n'ai pas ce probleme...

voir: http://systemzeb.free.fr/Soft/ProcessFileInfo.zip

j'y liste tous les process et modules, et puis j'utilise ma fonction...

++
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
31 août 2006 à 14:04
De rien ;)
Et aussi merci pour le code en entier, je viens de me rendre compte que la routine que j'employais dans mon application pour déterminer copyright/version/descritpion provoque une erreur de lecture mémoire dans certains cas.... je vais donc plutôt prendre ta méthode !

...


je viens de me rendre compte que la méthode que j'utilisais ressemble fortement à celle donnée par MadM@tt !
Celle que j'utilise :







' ------------------------------------------------
' Récupération des informations
' 'Version', 'Type', 'Copyright' et 'Description'
' d'un fichier DLL, OCX, EXE ou DRV
'
' Création: webcyril - Février 2001
' url: http://www.webcyril.fr.st
' ------------------------------------------------
'///code source repris et modifié depuis celui cité ci dessus
'seules les informations contenues dans les executables sont utilisees ici

'les 3 fonctions suivantes sont utilisées pour convertir des types de représentations de données entre eux
Public Function HIWORD(ByVal dwValue As Long) As Long
Dim hexstr As String
hexstr = Right("00000000" & Hex(dwValue), 8)
HIWORD = CLng("&H" & Left(hexstr, 4))
End Function

Public Function LOWORD(ByVal dwValue As Long) As Long
Dim hexstr As String
hexstr = Right("00000000" & Hex(dwValue), 8)
LOWORD = CLng("&H" & Right(hexstr, 4))
End Function

Public Function FixedHex(ByVal hexval As Long, ByVal nDigits As Long) As String
FixedHex = Right("00000000" & Hex(hexval), nDigits)
End Function

Public Sub EXEinfos(ByVal sFileName As String, sVersion As String, sCopyright As String, sDescription As String)
Dim vffi As VS_FIXEDFILEINFO ' version info structure
Dim buffer() As Byte ' buffer for version info resource
Dim pData As Long ' pointer to version info data
Dim nDataLen As Long ' length of info pointed at by pData
Dim cpl(0 To 3) As Byte ' buffer for code page & language
Dim cplstr As String ' 8-digit hex string of cpl

' Contrôle si le fichier contient des informations récupérables
nDataLen = GetFileVersionInfoSize(sFileName, pData)
If nDataLen = 0 Then
'0, donc pas d'infos
sVersion = "Pas de version"
sCopyright = "Pas de copyright"
sDescription = "Pas de description"
Exit Sub
End If

' Récupération de la 'Version' du fichier
' ---------------------------------------
' Make the buffer large enough to hold the version info resource.
ReDim buffer(0 To nDataLen - 1) As Byte
' Get the version information resource.
GetFileVersionInfo sFileName, 0, nDataLen, buffer(0)

' Get a pointer to a structure that holds a bunch of data.
VerQueryValue buffer(0), "", pData, nDataLen
' Copy that structure into the one we can access.
CopyMemory vffi, ByVal pData, nDataLen
' Display the full version number of the file.
sVersion = Trim(Str(HIWORD(vffi.dwFileVersionMS))) & "." & Trim(Str(LOWORD(vffi.dwFileVersionMS))) & "." & Trim(Str(HIWORD(vffi.dwFileVersionLS))) & "." & Trim(Str(LOWORD(vffi.dwFileVersionLS)))


' Récupération du 'Copyright' du fichier
' --------------------------------------
' Before reading any strings out of the resource, we must first determine the code page
' and language. The code to get this information follows.
VerQueryValue buffer(0), "\VarFileInfo\Translation", pData, nDataLen
' Copy that information into the byte array.
CopyMemory cpl(0), ByVal pData, 4
' It is necessary to swap the first two bytes, as well as the last two bytes.
' Convert those four bytes into a 8-digit hexadecimal string.
cplstr = FixedHex(cpl(1), 2) & FixedHex(cpl(0), 2) & FixedHex(cpl(3), 2) & FixedHex(cpl(2), 2)
' cplstr now represents the code page and language to read strings as.

' Read the copyright information from the version info resource.
VerQueryValue buffer(0), "\StringFileInfo" & cplstr & "\LegalCopyright", pData, nDataLen
' Copy that data into a string for display.
sCopyright = Space(nDataLen)
lstrcpy sCopyright, pData

' Récupération de la 'Description' du fichier
' -------------------------------------------
VerQueryValue buffer(0), "\StringFileInfo" & cplstr & "\FileDescription", pData, nDataLen
sDescription = Space(nDataLen)
lstrcpy sDescription, pData
End Sub






"En fait il s'agissait de lister les processus, puis j'ajoutais par exemple la description du fichier dans le listview afin d'avoir un peu plus d'infos sur un processus."
> DAMN ! Exactement dans les mêmes circonstances ! Je liste les modules des processus et j'affiche leur descritpion/version/copyright dans une listview....et paf , la mémoire ne peut être Written !


Damn !
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
31 août 2006 à 13:56
Salut,

Erf wai faute de distraction... Merci violent_ken ;)

Pour ceux l'ayant deja telecharge, il suffit de remplacer:
pos = InStrRev(PathFileName, ".")
If pos > 0 Then GetFileInfo.Extension = Right(PathFileName, Len(PathFileName) - pos)

par:

pos = InStrRev(GetFileInfo.FileName, ".")
If pos > 0 Then GetFileInfo.Extension = Right(GetFileInfo.FileName, Len(GetFileInfo.FileName) - pos)

Je ferai la mise a jour des que j'ai une minute

++
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
31 août 2006 à 13:15
Source intéressante. J'attire néanmoins l'attention sur un petit détail que j'ai remarqué.

Dans le cas d'un path contenant un point et d'un fichier n'ayant pas d'extension. L'extension renvoyée devrait être VbNullString, ce que ne fait pas la source (elle renvoie en effet toute la partie droite du path+fichier après le point).

Utilise donc d'abord un InStrRev sur le "" pour déterminer le fichier (sans le path) puis applique InStrRev sur le "." pour localiser l'extension.


Exemple de code ne marchant pas :

MsgBox GetFileInfo("c:\dossier.nouveau\fichier_sans_extension").Extension


@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
28 août 2006 à 18:47
Salut Drissou,

J'ai corrige ce probleme, mais je ne te garantis as qu'il soit compatible avec Win98...

++
cs_drissou Messages postés 160 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 14 janvier 2009
25 août 2006 à 09:11
Bonjour DRALUORG et MADM@ATT,

j'essaie d'utiliser cette source et je rencontre des "problèmes"
- lorsque j'essaie de 'lire ' un fichier non exe sur l'unité C, il ne me renvoie aucune donnée..
- lorsque j'essaie de lire un fichier exe situé sur une autre unité, pas d'infos non plus..

je suis sous Win 98

Merci
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
24 août 2006 à 22:09
re,

ok, je vais attendre de voir si je rencontre l'erreur, et dans ce cas je verrais ce que je peux faire...

Merci pour les infos ;)

++
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
24 août 2006 à 21:22
En fait il s'agissait de lister les processus, puis j'ajoutais par exemple la description du fichier dans le listview afin d'avoir un peu plus d'infos sur un processus.
C'était vraiment aléatoire, en fait c'est apparut au bout d'un certain temps d'utilisation, après avoir re-compilé et lancé plusieurs fois le prog en plein developpement.
Et le reboot n'y changait rien

Vu qu'il sagissait d'un overflow, ça devait etre le dernier terme du calcul : "ByteBuffer(1) * &H1000000" qui devait poser problème (le bug apparaissait dès que ByteBuffer(1) dépassait environ 100)
ça devait multiplier 100 par 16777216 (conversion de la valeur hexa), donc faire un trop gros nombre pour vb. Enfin je pense.

En fait ça a toujours bien marché pendant des années, jusqu'à ce qu'un jour ça ne marche plus... Et en attendant quelques temps, ça remarche... puis ça remarche plus... puis la ton prog marche (et mon ancienne source aussi)
C'est à perdre la boule, mais je suis de plus en plus convaincu que le problème doit venir de chez moi
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
24 août 2006 à 20:33
Salut MadM@tt,

Merci pour l'info ;)
Perso j'ai scanner quelques fois mes 5 disk je n'ai rencontrer aucun prob...
Enfait c'est la seul partie du code que j'ai recopier tel quel par flemme de me pencher dessus...

Sais tu sur quel genre de fichier tu recontrais ces erreurs ?
Ou bien ca se produisait "aleatoirement" ?

++
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
24 août 2006 à 18:29
salut, content que ma source ait pu servir ^^
par contre en utilisant (ma source) un peu intensivement dans d'autres prog que j'ai fait, je me suis rendu compte qu'à la ligne :
HexNumber = ByteBuffer(2) + ByteBuffer(3) * &H100 + ByteBuffer(0) * &H10000 + ByteBuffer(1) * &H1000000

ça plantait : overflow

à mon avis c'est juste que le calcul dépasse les limites de vb (mais pas le résultat),donc en gros la méthode de calcul ne doit pas etre parfaite.
Voici donc la source que j'utilise à présent :


' Récupérer une information sur un fichier
Public Function mfGetFileInfo(ByVal sFileName As String, FileInfo As mfFileInfo) As String
Dim Vffi As VS_FIXEDFILEINFO ' version info structure
Dim Buffer() As Byte ' buffer for info ressource
Dim pData As Long ' pointer to info data
Dim lDataLen As Long ' length of info pointed at by pData
Dim cpl(0 To 3) As Byte ' buffer for code page & language
Dim cplstr As String ' 8-digit hex string of cpl
Dim strVersionInfo As String
' Contrôle si le fichier contient des informations récupérables
lDataLen = GetFileVersionInfoSize(sFileName, pData)
If lDataLen = 0 Then
mfGetFileInfo = ""
Exit Function
End If
ReDim Buffer(0 To lDataLen - 1) As Byte
' Get the version information resource.
If GetFileVersionInfo(sFileName, 0, lDataLen, Buffer(0)) <> 0 Then
' Get a pointer to a structure that holds a bunch of data.
If VerQueryValue(Buffer(0), "", pData, lDataLen) <> 0 Then
' Copy that structure into the one we can access.
MoveMemory Vffi, ByVal pData, lDataLen
Select Case FileInfo
' ---------------------------------------
' Récupération de la 'Version' du fichier
Case FileVersion
' Display the full version number of the file.
mfGetFileInfo = Trim(Str(HIWORD(Vffi.dwFileVersionMS))) & "." & _
Trim(Str(LOWORD(Vffi.dwFileVersionMS))) & "." & _
Trim(Str(HIWORD(Vffi.dwFileVersionLS))) & "." & _
Trim(Str(LOWORD(Vffi.dwFileVersionLS)))
' ---------------------------------------
' Récupération des autres infos
Case Else
' L'info à récupérer
Select Case FileInfo
Case CompanyName
strVersionInfo = "CompanyName"
Case FileDescription
strVersionInfo = "FileDescription"
Case FileVersion
strVersionInfo = "FileVersion"
Case InternalName
strVersionInfo = "InternalName"
Case LegalCopyright
strVersionInfo = "LegalCopyright"
Case OriginalFileName
strVersionInfo = "OriginalFileName"
Case ProductName
strVersionInfo = "ProductName"
Case ProductVersion
strVersionInfo = "ProductVersion"
End Select
' Before reading any strings out of the resource, we must first determine the code page
' and language. The code to get this information follows.
If VerQueryValue(Buffer(0), "\VarFileInfo\Translation", pData, lDataLen) <> 0 Then
' Copy that information into the byte array.
MoveMemory cpl(0), ByVal pData, 4
' Convert those four bytes into a 8-digit hexadecimal string.
cplstr = FixedHex(cpl(1), 2) & FixedHex(cpl(0), 2) & FixedHex(cpl(3), 2) & FixedHex(cpl(2), 2)
' cplstr now represents the code page and language to read strings as.
' Read the copyright information from the version info resource.
If VerQueryValue(Buffer(0), "\StringFileInfo" & cplstr & "" & strVersionInfo, pData, lDataLen) <> 0 Then
' Copy that data into a string for display.
mfGetFileInfo = Space(lDataLen)
lstrcpy mfGetFileInfo, pData
End If
End If
End Select
End If
End If
End Function

' Creation d'une chaine Hexadecimale pour représenter un nombre
Public Function FixedHex(ByVal hexval As Long, ByVal nDigits As Long) As String
FixedHex = Right("00000000" & Hex(hexval), nDigits)
End Function

Private Function HIWORD(ByVal dwValue As Long) As Long
Dim hexstr As String
hexstr = Right("00000000" & Hex(dwValue), 8)
HIWORD = CLng("&H" & Left(hexstr, 4))
End Function

Private Function LOWORD(ByVal dwValue As Long) As Long
Dim hexstr As String
hexstr = Right("00000000" & Hex(dwValue), 8)
LOWORD = CLng("&H" & Right(hexstr, 4))
End Function




(désolé pour la longueur du commentaire)
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
24 août 2006 à 14:11
Oup's g oublier de dire qu'une bonne partie du code etait une adaptation d'une source de MadMatt ;)

++
Rejoignez-nous