Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RÉCUPÉRER LA DESCRIPTION D'UN EXECUTABLE + AUTRES INFORMATIONS (DATE, VERSION, COMPANY, COPYRIGHT, ETC...)


Information sur la source

Catégorie :Fichier / Disque Classé sous : executable, description, informations, company, version Niveau : Initié Date de création : 12/09/2004 Date de mise à jour : 22/04/2006 14:50:14 Vu : 3 885

Note :
10 / 10 - par 4 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note


Description

Voilà j'ai cherché une nuit entière pour trouver ça, et encore c'était pas commenté sauf quelques passages en anglais. Alors comme il n'y a pas de source qui ne fait que ça et qui est bien claire pour tout le monde, je la met donc, en espérant que ça vous serve comme à moi.
 

Source

  • ' ------------------------------------------------------------------
  • ' Exemple a mettre dans une form
  • Private Sub Form_Load()
  • Me.AutoRedraw = True
  • Me.Print GetDescription("C:\WINDOWS\Explorer.exe", FileDescription)
  • End Sub
  • ' ------------------------------------------------------------------
  • ' ça dans un module
  • ' Les api
  • Private Declare Function GetFileVersionInfo Lib "Version.dll" Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal dwHandle As Long, ByVal dwLen As Long, lpData As Any) As Long
  • Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
  • Private Declare Function VerQueryValue Lib "Version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
  • Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, ByVal Source As Long, ByVal Length As Long)
  • Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
  • ' Un argument de type Enum permet l'apparition d'une liste de
  • ' choix lors de la saisie de l'appel de fonction.
  • Public Enum TypeInfo
  • CompanyName = 0
  • FileDescription
  • FileVersion
  • InternalName
  • LegalCopyright
  • OriginalFileName
  • ProductName
  • ProductVersion
  • End Enum
  • ' Renvoie des informations sur les fichiers
  • Public Function GetDescription(ByVal FullFileName As String, ByVal TypeInfo As TypeInfo) As String
  • ' Les variables
  • Dim Buffer As String
  • Dim rc As Long
  • Dim strVersionInfo As String, strTemp As String
  • Dim BufferLen As Long, Dummy As Long
  • Dim sBuffer() As Byte
  • Dim ByteBuffer(255) As Byte
  • Dim Lang_Charset_String As String
  • Dim HexNumber As Long
  • Dim VerPointer As Long, Err As Long
  • ' Sélectionne le type de données que l'on veut récupérer
  • Select Case TypeInfo
  • 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
  • ' Récupère la taille
  • BufferLen = GetFileVersionInfoSize(FullFileName, Dummy)
  • If BufferLen < 1 Then Exit Function
  • ReDim sBuffer(BufferLen)
  • rc = GetFileVersionInfo(FullFileName, 0&, BufferLen, _
  • sBuffer(0))
  • If rc = 0 Then
  • GetDescription = False
  • Exit Function
  • End If
  • rc = VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", _
  • VerPointer, BufferLen)
  • If rc = 0 Then Exit Function
  • ' VerPointer est un pointeur de 4 octets de nombres hexadécimaux,
  • ' Les 2 premiers octets sont les identificateurs de la langue,
  • ' et les 2 derniers octets sont des pages de code
  • ' Quoiqu'il en soit, Lang_Charset_String nécessite une chaine de
  • ' 4 chiffres héxadécimaux,les 2 premiers caractères correspondent aux
  • ' identificateur du language et les 2 derniers caractères correspondent
  • ' aux identificateurs des pages de code
  • MoveMemory ByteBuffer(0), VerPointer, BufferLen
  • HexNumber = ByteBuffer(2) + ByteBuffer(3) * &H100 + ByteBuffer(0) * &H10000 + ByteBuffer(1) * &H1000000
  • Lang_Charset_String = Hex(HexNumber)
  • ' Maintenant on change l'ordre de l'identificateur du language et des pages de codes
  • ' et on le converti en chaine de caractères.
  • ' Par exemple on prend 040904E4
  • ' En y séparant on obtient :
  • ' 04------ = SUBLANG_ENGLISH_USA
  • ' --09---- = LANG_ENGLISH
  • ' ----04E4 = 1252 = Codepage for Windows:Multilingual
  • Do While Len(Lang_Charset_String) < 8
  • Lang_Charset_String = "0" & Lang_Charset_String
  • Loop
  • ' On formate la variable Buffer
  • Buffer = String(255, 0)
  • strTemp = "\StringFileInfo\" & Lang_Charset_String & "\" & strVersionInfo
  • ' On récupère les infos qui nous interessent
  • rc = VerQueryValue(sBuffer(0), strTemp, VerPointer, BufferLen)
  • If rc = 0 Then Exit Function
  • lstrcpy Buffer, VerPointer
  • ' On se débarasse des chr(0) contenus dans Buffer
  • Buffer = Mid$(Buffer, 1, InStr(Buffer, Chr(0)) - 1)
  • ' On renvoie la valeur
  • GetDescription = Buffer
  • End Function
' ------------------------------------------------------------------
' Exemple a mettre dans une form
Private Sub Form_Load()
    Me.AutoRedraw = True
    Me.Print GetDescription("C:\WINDOWS\Explorer.exe", FileDescription)
End Sub



' ------------------------------------------------------------------
' ça dans un module
' Les api
Private Declare Function GetFileVersionInfo Lib "Version.dll" Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal dwHandle As Long, ByVal dwLen As Long, lpData As Any) As Long
Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
Private Declare Function VerQueryValue Lib "Version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, ByVal Source As Long, ByVal Length As Long)
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long

' Un argument de type Enum permet l'apparition d'une liste de
' choix lors de la saisie de l'appel de fonction.
Public Enum TypeInfo
  CompanyName = 0
  FileDescription
  FileVersion
  InternalName
  LegalCopyright
  OriginalFileName
  ProductName
  ProductVersion
End Enum

' Renvoie des informations sur les fichiers
Public Function GetDescription(ByVal FullFileName As String, ByVal TypeInfo As TypeInfo) As String
    ' Les variables
    Dim Buffer As String
    Dim rc As Long
    Dim strVersionInfo As String, strTemp As String
    Dim BufferLen As Long, Dummy As Long
    Dim sBuffer() As Byte
    Dim ByteBuffer(255) As Byte
    Dim Lang_Charset_String As String
    Dim HexNumber As Long
    Dim VerPointer As Long, Err As Long

    ' Sélectionne le type de données que l'on veut récupérer
    Select Case TypeInfo
    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

    ' Récupère la taille
    BufferLen = GetFileVersionInfoSize(FullFileName, Dummy)
    If BufferLen < 1 Then Exit Function

    ReDim sBuffer(BufferLen)
    rc = GetFileVersionInfo(FullFileName, 0&, BufferLen, _
        sBuffer(0))
    If rc = 0 Then
        GetDescription = False
        Exit Function
    End If

    rc = VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", _
                                        VerPointer, BufferLen)
    If rc = 0 Then Exit Function
    ' VerPointer est un pointeur de 4 octets de nombres hexadécimaux,
    ' Les 2 premiers octets sont les identificateurs de la langue,
    ' et les 2 derniers octets sont des pages de code
    ' Quoiqu'il en soit, Lang_Charset_String nécessite une chaine de
    ' 4 chiffres héxadécimaux,les 2 premiers caractères correspondent aux
    ' identificateur du language et les 2 derniers caractères correspondent
    ' aux identificateurs des pages de code

    MoveMemory ByteBuffer(0), VerPointer, BufferLen

    HexNumber = ByteBuffer(2) + ByteBuffer(3) * &H100 + ByteBuffer(0) * &H10000 + ByteBuffer(1) * &H1000000
    Lang_Charset_String = Hex(HexNumber)
    ' Maintenant on change l'ordre de l'identificateur du language et des pages de codes
    ' et on le converti en chaine de caractères.
    ' Par exemple on prend 040904E4
    ' En y séparant on obtient :
    ' 04------         = SUBLANG_ENGLISH_USA
    ' --09----         = LANG_ENGLISH
    ' ----04E4 = 1252 = Codepage for Windows:Multilingual
    Do While Len(Lang_Charset_String) < 8
       Lang_Charset_String = "0" & Lang_Charset_String
    Loop

    ' On formate la variable Buffer
    Buffer = String(255, 0)
    strTemp = "\StringFileInfo\" & Lang_Charset_String & "\" & strVersionInfo
    ' On récupère les infos qui nous interessent
    rc = VerQueryValue(sBuffer(0), strTemp, VerPointer, BufferLen)
    If rc = 0 Then Exit Function
    lstrcpy Buffer, VerPointer
    ' On se débarasse des chr(0) contenus dans Buffer
    Buffer = Mid$(Buffer, 1, InStr(Buffer, Chr(0)) - 1)
    ' On renvoie la valeur
    GetDescription = Buffer
End Function

Conclusion

Par contre j'ai traduit les passages en anglais comme j'ai pu, je ne suis qu'un modeste lycéen qu'a des devoirs en plus grrrr, donc désolé si j'ai écorché quelque chose
Et puis je précise aussi que ce code n'est pas de moi à l'origine, j'ai fait le maximum pour qu'il soit plus clair et plus lisible, et facilement exploitable par tous, sans passer par des classes et tout... donc ne venez pas m'embeter avec ça je suis au courant que je n'en suis pas l'auteur ;)

allé que cela vous serve
@ +
MadMatt
 

Historique

22 novembre 2005 18:31:27 :
Ajout des mots clés
22 avril 2006 14:50:14 :
mise à jour des mots clés

Commentaires et avis

signaler à un administrateur
Commentaire de MadM@tt le 12/09/2004 00:33:43

Ah oui dites moi bien si ça marche sous tous les OS, ce serait cool
merci

signaler à un administrateur
Commentaire de PaTaTe le 12/09/2004 03:26:47

Marche tres bien avec Windows XP SP2 et Visual Basic SP6. C'est execellent !

J'avais une source precedente mais elle ne fontionnais apparement pas sur tous les executables fonctionne aussi sur les DLLs ActiveX VB)

10/10

signaler à un administrateur
Commentaire de MadM@tt le 12/09/2004 12:26:05

Merki !

signaler à un administrateur
Commentaire de bilaloch le 13/09/2004 18:08:50

Excellente source. Comme d'hab lol :) 10/10

@ +

BILALoch

signaler à un administrateur
Commentaire de MadM@tt le 13/09/2004 22:39:58

merci ça fait très plaisir :)
Par contre est ce que quelqu'un sait si ça marche sous win98 ou 2k ?

signaler à un administrateur
Commentaire de DrJo45 le 22/09/2004 10:54:12

d'après MSDE, cet exemple de code date de VB4.
Il est marqué comme valable sous 95,98, ME, NT, 200, XP
NB la version Unicode des dll existe (W au lieu de A) mais sous 95, 98 et Me, il faut ajouter la couche "Microsoft Unicode support."

signaler à un administrateur
Commentaire de MadM@tt le 23/09/2004 18:28:28

ça veut dire que dans mes déclarations d'api, il faut que je mette A pour celles de XP et W pour les autres ??
et c'est quoi la couche "Microsoft Unicode support" ?

sinon merci pour l'info

signaler à un administrateur
Commentaire de DrJo45 le 23/09/2004 18:56:53

Non, ne touche à rien.
La plupart des API ont une version ANSI et une version Unicode. On les distingue par le nom effectif de la fonction définit dans la clause ALIAS de la déclaration.
Exemple : lstrcpyA ou lstrcpyW parce qu'il travaille sur des chaines alors que RtlMoveMemory n'a pas de version Unicode car il n'a pas de paramètre chaine.
Les API unicode permettent dans certaines conditions d'être complètement Unicode dans un programme.
La couche Microsoft Unicode support est un supplément à W95 pour qu'il supporte les API unicode.

signaler à un administrateur
Commentaire de MadM@tt le 24/09/2004 21:25:06

Ok dac, cool j'ai appris un truc aujourd'hui merci !
@ +

signaler à un administrateur
Commentaire de BozzoDodo le 28/04/2005 19:00:40

Ce code n'est pas de toi! tu n'as pas ldroit de faire ca!!! nan jrigole merci de nous faire partager ce code =).
bonne prog'

signaler à un administrateur
Commentaire de MadM@tt le 28/04/2005 19:34:06

;-)

signaler à un administrateur
Commentaire de jmc70 le 13/11/2005 18:33:28

Exactement ce que je cherchais et en plus très clair.
Merci

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

memoire, version logiciel [ par florian1978 ] Bonjour Je desire crée un logiciel me permettant de recuperer certaines informations. le programme sera crée comme suit : un boutton + une list box je Identifier un executable [ par lebarn ] Bonjour à toi, lecteurJ'aimerais savoir comment lire les informations d'un programme quelque qu'il soit, vous savez celles qui s'affichent dans les pr Version executable [ par carmen_151 ] BonjourJe voudrais savoir si c'est possible, envba, de lire la version d'un fichier executableMerci Récupérer la description d'un executable [ par MadM@tt ] Salut, je cherche comment faire pour récupérer la description d'un fichier executable, pour l'utiliser à la place de son nom de fichier. Parce que "MS Extraire la version d'un executable [ par Rock ] Salut tous et bonne feteJe cherche a récupérer la version d'un fichier vb compilé (mon_fichier.exe), ca fait un petit moment que je cherche mais je ne Pb infos de version [ par smazaudi ] Bonjour à tous Voilà, je développe actuellement en Delphi 5 (je sais que c'est dépassé mais je n'ai pas le choix). Je viens d'améliorer mon soft et d Pb infos de version [ par smazaudi ] Bonjour à tous Voilà, je développe actuellement en Delphi 5 (je sais que c'est dépassé mais je n'ai pas le choix). Je viens d'améliorer mon soft et d récuperer la version et la description d'un fichier dll [ par elmekki ] Bonjour,Lorsue on passe le curseur sur un fichier dll il affiche quelques informations comme la description version, auteur,...Comment peut on récuper Informations de version d'un projet [ par vincentstryckmans ] Bonjour,Je souhaite récupérer les infos de version de mon projet et les afficher dans mon appli.J'utilise l'exemple donné dans l'aide de delphi (Bouto Ne pas changer le numéro de version de l'executable [ par boumbo73 ] Bonjour,Voil&#224; &#224; chaque fois que je compile mon projet en vb.net le num&#233;ro de version change. Or j'aimerais gard&#233; le m&#234;me !Pou


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.