Au sujet des Librairies...

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Au sujet des Librairies...

Message par Chris »

@ Fred

Est-ce que les librairies, (qu'elles soit utilisateur, ou inclues dans la distibution), ont un format particulier?

Par exemple, est-ce qu'elles ont un en-tête ou on peut retrouver la version, le nombre de fonctions, la taille, etc....

Enfin bref, tu vois un peu ce que je veux dire! :lol:

Je voudrais essayer de faire un petit utilitaire qui analyserait chaque librairies et chaque fichier .res pour détecter si il y a des noms, (de fonction, ou de constantes), en double.

Bon, j'ai un peu essayé de lire des lib dans un éditeur hexadécimal, mais je ne sais pas trop utiliser ce genre de truc, et du coup, je ne suis pas beaucoup plus renseigné qu'avant.

Chris :)
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Sur le forum anglais y'a un bout de code qui permet de lire les headers des libraries (je sais plus exactement ou..). Le format en soit est relativement simple.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ca fait 3 heures que je recherche ce post sur le forum anglais et j'en ai m.... J'ai fait des dizaines de requêtes pour rien, j'ai lu des dizaines de posts .........

Qui a le lien de ce post ou le code correspondant ?

Sinon va falloir repasser des heures à décomposer le header pour faire la même chose, je n'ai pas envie de réinventer l'eau chaude :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai fait pareil!

J'ai passé plus d'une heure à chercher sans rien trouver, finalement, j'ai laissé tomber :lol:

Je pensais que ça venait de moi, ça me console!!! :lol:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je crois que Fred confond avec un code de Num3 qui extrait les constantes des fichiers res, mais ça j'ai pas besoin.

Je vais demander à Fred comment est fait le header de ces fichiers et si la compression des Lib le modifie. Je n'ai pas trop de temps à perdre pour analyser ce header, ça ne m'apportera pas grand chose.

Merci Chris
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Chris,

voici un code que je viens d'écrire pour extraire uniquement les noms de commandes des librairies "standart" de PB (pas celles du dossier Window ni les lib utilisateur)

Dans le résultat, certaines librairies n'ont pas de commandes (?) et en regardant le fichier, tout semble crypté.

Les noms qui se terminent avec un numéro indiquent que ces commandes ont des paramètres optionnels; le nom de commande PB interne avec ce numéro existe bien.

J'ai essayé de comprendre comment le header est fait, j'ai saisi je crois ( :roll: ) le principe par contre je n'arrive pas à saisir la délimitation des champs, c'est différent en fonction des fichiers.

Donc je ne suis pas certain que toutes les commandes y soient....

Code : Tout sélectionner

Global CheminPB$
NewList ListeLibWindows.string()
NewList ListeLibStandart.string()


;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure.s CheminPureBasic()
   Buffer$ = Space(260) : BufferSize = 259
   If GetVersion_() & $FF0000 ; Windows NT/XP
        clef = #HKEY_CLASSES_ROOT
        Adresse = @"Applications\PureBasic.exe\shell\open\command"
   Else ; La même chose pour Win9x
        clef = #HKEY_LOCAL_MACHINE 
        Adresse = @"Software\Classes\PureBasic.exe\shell\open\command"
   EndIf

   If RegOpenKeyEx_(clef, Adresse, 0, #KEY_ALL_ACCESS, @Key) = #ERROR_SUCCESS
      If RegQueryValueEx_(Key, "", 0, @type, @Buffer$, @BufferSize) = #ERROR_SUCCESS
         OutputDirectory$ = GetPathPart(Mid(Buffer$, 2, Len(Buffer$) - 7))
      EndIf
      RegCloseKey_(Key)
   EndIf
   ProcedureReturn OutputDirectory$
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure ListFichiersLibWindows()
   ;stocke Tous les noms de fichiers du repertoire Windows des librairies
   Retour = #false
   If ExamineDirectory(0, CheminPB$+"PureLibraries\Windows\", "*.*")
      ProchainDir = NextDirectoryEntry() 
      While ProchainDir  <> 0 
        If Nom_de_fichier$ <> "." And Nom_de_fichier$ <> ".." And ProchainDir = 1
           Nom_de_fichier$ = DirectoryEntryName() 
           If Len(GetExtensionPart(CheminPB$+"PureLibraries\Windows\"+ Nom_de_fichier$)) = 0
              ; on ne prend en compte que les fichiers sans extension, on ne sait jamais
              AddElement(ListeLibWindows())
              ListeLibWindows()\s = Nom_de_fichier$
              Fichier +1
           EndIf
        EndIf 
        ProchainDir = NextDirectoryEntry() 
     Wend    
      Retour = #true
   Else   
      Retour = -1  ; impossible d'examiner
   EndIf
   ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure ListFichiersLibStandart()
   ;stocke Tous les noms de fichiers du repertoire des librairies sauf window et sauf userLib
   Retour = #false
   If ExamineDirectory(0, CheminPB$+"PureLibraries\", "*.*")
      ProchainDir = NextDirectoryEntry() 
      While ProchainDir  <> 0 
        If ProchainDir = 1
           Nom_de_fichier$ = DirectoryEntryName() 
           If Len(GetExtensionPart(CheminPB$+"PureLibraries\"+ Nom_de_fichier$)) = 0
              ; on ne prend en compte que les fichiers sans extension, on ne sait jamais
              AddElement(ListeLibStandart())
              ListeLibStandart()\s = Nom_de_fichier$
              Fichier +1
           EndIf
        EndIf 
        ProchainDir = NextDirectoryEntry() 
     Wend    
      Retour = #true
   Else   
      Retour = -1  ; impossible d'examiner
   EndIf
   ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure IsStringWindowsFile(File$)
; retourne #true si les noms correspondent, sinon #false
   PositionDansLaListe = ListIndex(ListeLibWindows())
   ForEach ListeLibWindows()
      If UCase(File$) = UCase(ListeLibWindows()\s)
         Retour = #true
         Break
      EndIf
   Next
   SelectElement(ListeLibWindows(), PositionDansLaListe)
   ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure IsStringStandartFile(File1$)
; retourne #true si les noms correspondent, sinon #false
   PositionDansLaListe = ListIndex(ListeLibStandart())
   ForEach ListeLibStandart()
      If UCase(File1$) = UCase(ListeLibStandart()\s)
         Retour = #true
         Break
      EndIf
   Next
   SelectElement(ListeLibStandart(), PositionDansLaListe)
   ProcedureReturn Retour
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
Procedure LectureFichier(FichierCourant$)
   If ReadFile(0, CheminPB$ + "PureLibraries\"+FichierCourant$)
      While Eof(0) = 0
         a$ = Trim(ReadString())
         If Left(a$, 4) = "ERUP"
            ERUP + 1
            If ERUP > 1
               Break
            EndIf
         ElseIf Left(a$, 4) = "LIB3"
            ; on passe le mot
         Else
;            If a$ <> "" And Len(a$) > 1
            If Len(a$) > 1
               Char = PeekB( @A$)
               If (Char >= 'a' And Char <= 'z') Or (Char >= 'A' And Char <= 'Z')
                  ; on teste si c'est le nom d'un fichier lib Window et aussi un nom de fichier lib standart
                  ; si oui, on ne prend pas en compte
                  If IsStringWindowsFile(a$) = #false And IsStringStandartFile(a$) = #false
                     Debug "   "+a$
                  EndIf
               EndIf
            EndIf
         EndIf
      Wend
   Else
      MessageRequester("", "Impossible ouvrir fichier", 16)
   EndIf
EndProcedure
;//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\

; -- Prog principal 

CheminPB$ = CheminPureBasic()
If ListFichiersLibWindows() And ListFichiersLibStandart()
   ; on lit toutes les libs standart et on extrait
   Debug CountList(ListeLibStandart())
   ForEach ListeLibStandart()
      Debug "Fichier librairie --> "+ListeLibStandart()\s
      LectureFichier(ListeLibStandart()\s)
      Debug "- - - - "
      Debug ""
      Debug ""
   Next
EndIf
End
Dernière modification par Anonyme2 le mer. 15/déc./2004 13:44, modifié 1 fois.
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Desolé pour le manque d'informations, je n'etait pas chez moi hier soir (ni ce soir d'ailleurs). Je vais essayer de te faire ca ce Week-end.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fred a écrit :Desolé pour le manque d'informations, je n'etait pas chez moi hier soir (ni ce soir d'ailleurs). Je vais essayer de te faire ca ce Week-end.
:D :D
El_Choni
Messages : 46
Inscription : dim. 07/mars/2004 20:19
Localisation : Espagne

Message par El_Choni »

J'avais fait il'y a quelques mois une petite app pour montrer les fonctions dupliquées, et "deactiver" les librairies avec ces fonctions (copier-les a un autre directoire) ou même deactiver seulement la fonction dupliquée. Si vous êtes interesé, je peux posser un link ici quand je sois retourné chez moi, je ne l'ai pas ici.

Bon jour,
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci El_Choni,

je suis interessé.
J'ai cherché sur le forum anglais mais j'ai rien trouvé.

Merci pour le lien :wink:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

El_Choni

tu peux mettre ton lien (you could put your link here, tks)
El_Choni
Messages : 46
Inscription : dim. 07/mars/2004 20:19
Localisation : Espagne

Message par El_Choni »

Pas terminé, mais vous pouvez en regarder un peu comme ça est:

http://inicia.es/de/elchoni/PBLibManager.exe

Bonjour,
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Merci, El_Choni!
C'est du bon boulot :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci El_Choni

je vais regarder ça :D
El_Choni
Messages : 46
Inscription : dim. 07/mars/2004 20:19
Localisation : Espagne

Message par El_Choni »

Et le methode que TailBite utilise por creer une liste des API:

Code : Tout sélectionner

Procedure.s GetPBFolder()
  Shared hKey1, Type
  cbData = (#MAX_PATH*2)+2
  lpbData = AllocateMemory(cbData)
  If GetVersion_()&$ff0000 ; Windows NT/XP
    If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1)=#ERROR_SUCCESS
      If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData)=#ERROR_SUCCESS
        Folder$ = PeekS(lpbData)
        Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$)-7))
      EndIf
      RegCloseKey_(hKey1)
    EndIf
  Else  ; The same for Win9x 
    If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1)=#ERROR_SUCCESS 
      If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData)=#ERROR_SUCCESS
        Folder$ = PeekS(lpbData)
        Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$)-7))
      EndIf
      RegCloseKey_(hKey1)
    EndIf
  EndIf
  FreeMemory(lpbData)
  ProcedureReturn Folder$
EndProcedure

Procedure BuildApiList(PBFolder$)
  WNL$ = Chr(13)+Chr(10)
  WindowsLibsFolder$ = PBFolder$+"PureLibraries\Windows\"
  DLLCount = 0
  APICount = 0
  If CreateFile(6, "APILIST1.TXT") And CreateFile(7, "APILIST2.TXT")
    If ExamineDirectory(0, WindowsLibsFolder$, "")
      While NextDirectoryEntry()
        DLLName$ = DirectoryEntryName()
        If DLLName$<>"." And DLLName$<>".." And FileSize(WindowsLibsFolder$+DLLName$)<>-2
          If OpenFile(1, WindowsLibsFolder$+DLLName$)
            ApiListSize = Lof()
            *ApiList = AllocateMemory(ApiListSize)
            ReadData(*ApiList, ApiListSize)
            CloseFile(1)
            ApiEnd = *ApiList+ApiListSize
            ApiSeeker = *ApiList+9+Len(DLLName$)+1
            UseFile(7)
            While ApiSeeker<ApiEnd
              ThisAPIFunction$ = PeekS(ApiSeeker)
              ApiSeeker+Len(ThisAPIFunction$)+3
              nArg = PeekB(ApiSeeker-2)*4
              If PeekB(ApiSeeker-1)>0 And Right(ThisAPIFunction$, 1)<>"A"
                ThisAPIFunction$+"A"
              EndIf
              WriteString("_"+ThisAPIFunction$+"@"+Str(nArg)+"  "+Str(DLLCount)+WNL$)
              APICount+1
            Wend
            FreeMemory(*ApiList)
            UseFile(6)
            WriteString(DLLName$+".DLL"+WNL$)
            DLLCount+1
          EndIf
        EndIf
      Wend
    EndIf
    CloseFile(7)
    CloseFile(6)
    If FileSize("APILIST.TXT")<>-1
      DeleteFile("APILIST.TXT")
    EndIf
    If CreateFile(6, "APILIST.TXT")
      WriteString(Str(DLLCount)+WNL$)
      If OpenFile(7, "APILIST1.TXT")
        ApiListSize = Lof()
        *ApiList = AllocateMemory(ApiListSize)
        ReadData(*ApiList, ApiListSize)
        CloseFile(7)
        UseFile(6)
        WriteData(*ApiList, ApiListSize)
        FreeMemory(*ApiList)
        WriteString(Str(APICount)+WNL$)
        If OpenFile(7, "APILIST2.TXT")
          ApiListSize = Lof()
          *ApiList = AllocateMemory(ApiListSize)
          ReadData(*ApiList, ApiListSize)
          CloseFile(7)
          UseFile(6)
          WriteData(*ApiList, ApiListSize)
          FreeMemory(*ApiList)
        EndIf
      EndIf
      CloseFile(6)
      DeleteFile("APILIST1.TXT")
      DeleteFile("APILIST2.TXT")
    EndIf
  EndIf
EndProcedure

BuildApiList(GetPBFolder())
Répondre