Page 1 sur 1

récupérer les noms d'API de ses fichiers PB

Publié : sam. 14/nov./2009 16:38
par Anonyme2
J'avais besoin d'avoir la liste des API de mon projet (fichiers PB), alors j'ai détourné un code de ce forum permettant de générer toutes les déclarations de procédures et je l'ai adapté.

C'est loin d'être parfait, si on a plusieurs API sur la même ligne, on affiche la ligne entière, ça me permet de contrôler le résultats des API imbriquées et de corriger si nécessaire.

Avec cette liste d'API, je peux retrouver l'OS minimum ainsi que la version de IE ou autre composant Windows nécessaire à l'exécution de mon projet (il faut se farcir chaque API sur le site MS (SDK)).

Les limites sont au niveau des API comme sendmessage (dépendant du type de message), par exemple les messages de Listicon LVM_xx ne nécessitent pas tous le même OS.

Mettez votre directory pour vos fichiers dans la variable Directory$, sachant qu'il n'y a pas d'appels de sous-dossier, on analyse ceux de la directory.

Voilà par exemple le résultat d'un de mes fichiers (je ne met pas tout, c'est trop long).

Code : Tout sélectionner

; Fichier PureiconManager_Macros.pb
LockResource_()
SizeofResource_()
UpdateResource_()
EnumResourceNames_()
FindResourceEx_()
CreateFile_()
CreateFileMapping_()
CloseHandle_()
MapViewOfFile_()
CloseHandle_(hMapFile) : CloseHandle_(hFile)
VirtualQuery_()
UnmapViewOfFile_(*MapViewOfFile) : CloseHandle_(hMapFile) : CloseHandle_(hFile)
WriteFile_()
BeginUpdateResource_()
EndUpdateResource_()

Code : Tout sélectionner

;//    Description

;// recherche toutes les API des fichiers d'un dossier
;// affiche le nom du fichier s'il contient des API
;// ainsi que le nom de ou des API qu'il contient

;// Limites :
;//   Si une API est déjà dans la liste, elle n'apparaitra pas
;//   si elle est dans un fichier qui suit.

;//   Pour avoir les doublons, répondez oui au lancement
;//   Si on répond oui, on aura toutes les API de chaque fichier



;// Fait par Denis le 14 Novembre 2009



Structure MyDeclare
     NomProc.s
     API_Name.s
EndStructure


EnableExplicit

Global NewList MyDeclarations.MyDeclare()
Global Directory$

Global Element_Courant.l
Global SourceFileName.s = ProgramParameter()
Global Chaine.s = ""
Global TempDir.s = GetTemporaryDirectory()
Global Tmpchaine.s = ""
Global RC.s = Chr(13) + Chr(10)

Global Position = -1, GarderDoublons.l

Directory$ = "K:\PureBasic\Projets\Editeur d icones\PureIconManager\PIM_1_0"


Procedure CheckString(Chaine.s)
     Protected Doublon = #False
     Protected Position.l, Nb_API.l, Nb_espaces.l, longueur.l, i.l
     Protected Data01.s = Trim(Chaine)
     Protected Data02.s = ""
     
     ;// on élimine les commentaires
     Position = FindString(Data01, ";", 1)
     If Position <> 0
          Data01 = RTrim(Left(Data01, Position-1))
          If Len(Data01) = 0
               ProcedureReturn
          EndIf
     EndIf
     
     ;// recherche des API avec _(
     ;// si pas d'API trouvée, on retourne une chaine vide
     Position = FindString(Data01, "_(", 1)
     If Position = 0
          Data01 = ""
          ProcedureReturn
     EndIf
     
     ;// on ne garde que l'API
     ;// on cherche combien d'API il y a dans la chaine
     Nb_API = CountString(Data01, "_(")
     
     Select Nb_API
          Case 1
               ;// 1 seule, on isole jusqu'au nom
               Data01 = Left(Data01, Position+1)
               ;// on isole que le nom de l'API en cherchant
               ;// le dernier espace de la chaine
               Nb_espaces = CountString(Data01, " ")
               
               For i = (Len(Data01)-2) To 1 Step-1
                    Select Asc(Mid(Data01, i, 1))
                         Case 'A' To 'Z', 'a' To 'z', '0' To '9', '_'
                              Data02 = Mid(Data01, i, 1) + Data02
                         Default
                              Break
                    EndSelect
               Next
               
               Data01 = Data02 + "_()"
          Default
               ;// plusieurs API par ligne, on ne fait rien
               
     EndSelect
     
     
     If GarderDoublons = #False
          ForEach MyDeclarations()
               If MyDeclarations()\API_Name = Data01
                    ;// on ne fait rien car doublon
                    Doublon = #True
                    Break
               EndIf
          Next
     EndIf
     
     
     If Doublon = #False
          ;// on ajoute à la liste chainée
          If AddElement(MyDeclarations())
               MyDeclarations()\API_Name = Data01
          Else
               MessageRequester("Erreur", "Impossible de créer un élément", 16)
               End
          EndIf
     EndIf
     
     ProcedureReturn
     
EndProcedure


ClearClipboard()


If MessageRequester("Doublons", "Laisser les doublons .", #PB_MessageRequester_YesNo ) = 6
     GarderDoublons = #True
EndIf

If ExamineDirectory(0, Directory$, "Purei*.pb")
     While NextDirectoryEntry(0)
          If DirectoryEntryType(0) = #PB_DirectoryEntry_File
               SourceFileName = DirectoryEntryName(0)
               If SourceFileName <> "PureIconManger_Viewer_PackFile.pb"
                    If OpenFile(1, SourceFileName)
                         Position = ListIndex(MyDeclarations())
                         If AddElement(MyDeclarations()) = 0
                              CloseFile(1)
                              FinishDirectory(0)
                              MessageRequester("Erreur", "Impossible de créer un élément", 16)
                              End
                         EndIf
                         
                         Element_Courant = ListIndex(MyDeclarations())
                         
                         MyDeclarations()\NomProc = "; Fichier " + SourceFileName
                         
                         While Eof(1) = 0
                              Chaine = ReadString(1)
                              CheckString(Chaine)
                         Wend
                         
                         If ListIndex(MyDeclarations()) = Element_Courant
                              ;// le fichier ne contient pas d'API
                              ;// on supprime l'élément qui contient le nom de fichier
                              DeleteElement(MyDeclarations())
                         EndIf
                         
                         CloseFile(1)
                    Else
                         MessageRequester("Information", "Desolé, une erreur s'est produite lors de l'acces au fichier "+SourceFileName+" !", 0)
                         End
                    EndIf
               EndIf
          EndIf
     Wend
     FinishDirectory(0)
     
     
     ForEach MyDeclarations()
          Tmpchaine + MyDeclarations()\API_Name+MyDeclarations()\NomProc + RC
     Next
     SetClipboardText(Tmpchaine)
     MessageRequester("Infos", "Opération terminée", 0)
EndIf