Page 1 sur 1

Dll informations ?????

Publié : jeu. 27/sept./2007 11:05
par Kwai chang caine
Bonjour à tous

J'ai créé une dll toute bete (nomal, j'ai dit "J'ai créé" avec toute bete y'a pléonasme :D).
Que disais-je ....... ah oui, j'ai créé cette DLL et j'ai utilisé le code de XOMBIE pour lire les infos que j'avais dedans (par curiosité).

Je sais, je sais, la curiosité est un vilain defaut :?

Code : Tout sélectionner

Procedure.s GetFileVersionInfo(File.s) 
   Protected iLibrary.l, iFunctionInfo.l, iFunctionSize.l, iFunctionQry.l, *HoldVersion.l, HoldResult.l, HoldBuffer.l, HoldEmpty.l 
   Protected HoldString.s, HoldReturn.s 
   Protected *HoldInfo.VS_FIXEDFILEINFO 
   iLibrary = OpenLibrary(#PB_Any, "version.dll") 
   If iLibrary 
      iFunctionInfo = GetFunction(iLibrary, "GetFileVersionInfoA") 
      iFunctionSize = GetFunction(iLibrary, "GetFileVersionInfoSizeA") 
      iFunctionQry = GetFunction(iLibrary, "VerQueryValueA") 
      If iFunctionInfo And iFunctionSize And iFunctionQry 
         HoldBuffer = CallFunctionFast(iFunctionSize, @File, @HoldEmpty) 
         HoldReturn = Space(HoldBuffer) 
         HoldResult = CallFunctionFast(iFunctionInfo, File, 0, HoldBuffer, @HoldReturn) 
         HoldResult = CallFunctionFast(iFunctionQry, @HoldReturn, "\", @HoldEmpty, @HoldBuffer) 
         *HoldInfo = AllocateMemory(SizeOf(VS_FIXEDFILEINFO)) 
         CopyMemory(HoldEmpty, *HoldInfo, SizeOf(VS_FIXEDFILEINFO)) 
         HoldString = Str(*HoldInfo\dwFileVersionMS >> 16 & $FFFF) + "." + Str(*HoldInfo\dwFileVersionMS & $FFFF) + "." + Str(*HoldInfo\dwFileVersionLS >> 16 & $FFFF) + "." + Str(*HoldInfo\dwFileVersionLS & $FFFF) 
         CloseLibrary(iLibrary) 
         FreeMemory(*HoldInfo) 
         HoldReturn = Space(0) 
         If HoldResult 
            ProcedureReturn HoldString 
         Else 
            ProcedureReturn "" 
         EndIf 
      EndIf 
      CloseLibrary(iLibrary) 
   EndIf 
EndProcedure

Debug GetFileVersionInfo("c:\MDllPure.dll")
Et ça m'a répondu "quequechose" 8O

Code : Tout sélectionner

125.376.125.376
Par contre j'ai apres utilisé celle de DENIS, qui a dit :
J'ai amélioré la version du forum anglais de Xombie, pour le format unicode ou ASCII

Code : Tout sélectionner

Procedure.s GetFileVersionInfo(File.s) 
   ; procedure de Xombie ici http://www.purebasic.fr/english/viewtopic.php?t=18853 
   ; modifiée pour mon besoin 
    
   Protected iLibrary.l, iFunctionInfo.l, iFunctionSize.l, iFunctionQry.l 
   Protected HoldString.s, HoldReturn.s, *HoldVersion, HoldResult.l 
   Protected HoldBuffer.l, HoldEmpty.l, *HoldInfo.VS_FIXEDFILEINFO 
    
   iLibrary = OpenLibrary(#PB_Any, "version.dll") 
    
   If iLibrary 
      
      CompilerIf #PB_Compiler_Unicode 
         iFunctionInfo = GetFunction(iLibrary, "GetFileVersionInfoW") 
         iFunctionSize = GetFunction(iLibrary, "GetFileVersionInfoSizeW") 
         iFunctionQry = GetFunction(iLibrary, "VerQueryValueW") 
      CompilerElse 
         iFunctionInfo = GetFunction(iLibrary, "GetFileVersionInfoA") 
         iFunctionSize = GetFunction(iLibrary, "GetFileVersionInfoSizeA") 
         iFunctionQry = GetFunction(iLibrary, "VerQueryValueA") 
      CompilerEndIf 
      
      If iFunctionInfo And iFunctionSize And iFunctionQry 
          
         HoldBuffer = CallFunctionFast(iFunctionSize, @File, @HoldEmpty) 
         If HoldBuffer 
            HoldReturn = Space(HoldBuffer) 
            HoldResult = CallFunctionFast(iFunctionInfo, File, 0, HoldBuffer, @HoldReturn) 
            If HoldResult 
               HoldResult = CallFunctionFast(iFunctionQry, @HoldReturn, "\", @HoldEmpty, @HoldBuffer) 
               If HoldResult 
                  *HoldInfo = AllocateMemory(SizeOf(VS_FIXEDFILEINFO)) 
                  
                  CopyMemory(HoldEmpty, *HoldInfo, SizeOf(VS_FIXEDFILEINFO)) 
                  
                  HoldString = Str(*HoldInfo\dwFileVersionMS >> 16 & $FFFF) + "." + Str(*HoldInfo\dwFileVersionMS & $FFFF) + "." + Str(*HoldInfo\dwFileVersionLS >> 16 & $FFFF) + "." + Str(*HoldInfo\dwFileVersionLS & $FFFF) 
                  
                  CloseLibrary(iLibrary) 
                  
                  FreeMemory(*HoldInfo) 
                  
                  If HoldResult 
                     ProcedureReturn HoldString 
                  Else 
                     ProcedureReturn "" 
                  EndIf 
               EndIf 
            EndIf 
         EndIf 
      EndIf 
      CloseLibrary(iLibrary) 
   EndIf 
   ProcedureReturn "" 
EndProcedure 

Debug GetFileVersionInfo(("c:\MDllPure.dll")
Et la ma DLL "Acoseplus" :cry:

Mes deux questions sont donc :
Qu'est ce que ça veut dire la réponse du 1er code de xombie "125.376.125.376" et pourquoi le 2e il dit plus rien :?:

Merci et bonne journée

Publié : jeu. 27/sept./2007 18:11
par Flype
s'lut

ca renvoie la version d'un fichier ( en l'occurence une DLL dans cette example mais ca peut etre un exe si on veut )

si on essaye ce code sur une dll windows j'ai bien les bonnes versions.

si aucune version n'est précisé dans ton projet t'aura rien (c'est pour çà que tu as rien sur la version de denis qui a dû corrigé le bug de xombie).

par contre si dans : menu -> compilateur -> options du compilateur... -> onglet informations de version -> version du fichier -> tu mets 1.2.3.4 par ex alors çà devrait marcher.

:wink:

Publié : jeu. 27/sept./2007 18:27
par Anonyme2
J'ai ajouté la possibilité d'utiliser les fonctions si on compile en mode unicode, si ça ne retourne rien , cherches pourquoi on arrive à retourner ProcedureReturn ""

Testes toutes les variables qui pourraient amener à ce résultat et dis-nous :D

Je me souviens de mes essais, c'était concluant.

Publié : ven. 28/sept./2007 21:36
par Kwai chang caine
Bonjour FLYPE

Tu as raison (evidemment), j'obtiens bien la version du fichier quand je fais comme tu as dit.
Par contre ce que je viens de decouvrir, c'est que quand je decoche "inclure les information de version" eh bien j'ai ce retour bizaroid "137.376.137.376" avec le premier code, et je ne sais pas si il correspond à quelque chose. :roll:
Avec le code de DENIS rien (champ vide).

Et quand je coche "inclure les information de version", alors la avec les deux codes, j'ai "0.0.0.0".

Ce n'est pas bien grave, mais j'aurais aimé savoir ou il pechait ce "137.376.137.376"

En tout cas merci de ton explication détaillée :wink:

Bonjour DENIS

Je n'ai pas eu l'honneur de beaucoup parler avec toi depuis que je suis sur ce forum, alors peut etre que tu ne sais pas que FRED aurait du créer rien que pour moi une rubrique "Foetus de la prog" :D

C'est "beaucoup trop de la honnir", mais tu me parle comme si je m'y connaissais en prog.
Cela me fait de la peine de te décevoir, mais je crois que je suis monté bien trop fin pour pouvoir répondre à ta question.
Tu sais ce code est aussi comprehensible pour moi que les elucubrations d'un chinois sous la torture :oops:
J'y travaille pourtant tous les jours, mais plus j'apprend plus j'ai l'impression de ne rien savoir, si je n'aimais pas tant pure, ce forum et vous tous, je crois que je me serais lassé. :cry:

Ce qui m'avais étonné c'etait ce retour "137.376.137.376" alors peut etre est-ce une erreur du premier code.

En tout cas merci de ta reponse.

Publié : sam. 29/sept./2007 4:42
par Anonyme2
Salut Kwai chang caine, je vais faire des essais aujourd'hui en créant une dll et je te dirais quoi. :D

Publié : sam. 29/sept./2007 6:37
par Kwai chang caine
Je te remercie beaucoup de ta gentillesse 8)

Publié : ven. 05/oct./2007 15:23
par Anonyme2
Salut Kwai chang caine

je viens de faire des essais (pas eu trop le temps avant :roll: )

Le code de Xombie plante chez moi (Vista), ligne

Code : Tout sélectionner

CopyMemory(HoldEmpty, *HoldInfo, SizeOf(VS_FIXEDFILEINFO))
effectivement, le paramètre HoldBuffer de la ligne

Code : Tout sélectionner

 HoldBuffer = CallFunctionFast(iFunctionSize, @File, @HoldEmpty)
vaut 0, et n'est pas un pointeur valide.

En mettant des if pour éviter le plantage, les valeurs retournées changent à chaque lancement pour la même dll (compilé sans numéro de version)

Le code que j'ai corrigé fonctionne comme le dit Flype si tu entres un numéro de version dans les options de compilation.

Tu peux sélectionner dans les options de compilation le mode unicode, et tu verras que le code corrigé fonctionne dans les 2 cas, unicode ou non.

Les API utilisées sont différentes pour l'unicode ou le codage normal.

Elles se finissent par A pour le mode normal et par W pour l'unicode.

Code : Tout sélectionner

GetFileVersionInfoA
ou

Code : Tout sélectionner

GetFileVersionInfoW
Voilà :D

Publié : lun. 08/oct./2007 12:34
par Kwai chang caine
Je te remercie beaucoup DENIS de la peine que tu as pris pour moi. 8)

Je vais regarder ça

Bonne journée à toi