Importer les fonctions d'une DLL

Partagez votre expérience de PureBasic avec les autres utilisateurs.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Importer les fonctions d'une DLL

Message par lionel_om »

Bonjour à tous.

Blasé de faire des copier/coller pour ajouter une à une chaque fonction d'une DLL avec un LoadLibrary(), j'ai écrit un petit programme sans prétention mais assez utile permettant de générer le fichier d'importation et de déclaration des fonctions.

Une fois ce fichier généré, il ne vous restera plus qu'à modifier les paramètres des fonctions et après un "IncludeFile" le tour est joué !!!

Code : Tout sélectionner

; Author : Lionel_om
; Date   : 08/04/2007


; Description : génère un fichier PBI qui se chargera d'ouvrir la DLL spécifiée et de charger les les fonctions.
;   Il n'y aura plus qu'à modifier les paramètres des fonctions.



; ------ For Texte File -------
#FileFonctionList = "" ;"twain_fonctions.pbi"
  ; If #FileFonctionList = "", Fonctions names will be directly keep from the DLL
  ; Otherwise, read from this text file


; ------ For Loading From The DLL -------
#FileDLL = "web_cam.DLL"




#FileFonctionImport =   "import.pbi"              ; Name of Output File

#LibraryName =          "TWAIN"                   ; Name of the library

#hLibPointer =          #LibraryName + "_hLib"    ; Pointer name
#Fonction_Init =        #LibraryName + "_Init"    ; Init Procedure Name
#Fonction_UnInit =      #LibraryName + "_UnInit"  ; UnInit Procedure Name

#PB__CallFunction =     "CallFunctionFast"        ; Name of PB Procedure used for calling DLLs procedures
#PB__GetFunctionMacro = "GetFunction_"            ; Name of local procedure for output warning





Global NewList Fonction.s()

DeleteFile(#FileFonctionImport)
hFileOut.l = CreateFile(#PB_Any, #FileFonctionImport)
If hFileOut
  
  If Len(#FileFonctionList)
    ; Read From Text File
    hFileIn.l = OpenFile(#PB_Any, #FileFonctionList)
    If hFileIn
      While Not(Eof(hFileIn))
        line$ = ReadString(hFileIn)
        If UCase(Left(line$, 5)) = "TWAIN"
          AddElement(Fonction())
          Fonction() = Trim(StringField(line$, 1, ";"))
        EndIf
      Wend
      CloseFile(hFileIn)
    EndIf
  Else
    ; Read From DLL File
    hLib.l = OpenLibrary(#PB_Any, #FileDLL)
    If hLib
      ExamineLibraryFunctions(hLib)
      While NextLibraryFunction()
        AddElement(Fonction())
        Fonction() = LibraryFunctionName()
      Wend
    EndIf
  EndIf
    
  If CountList(Fonction())
    
    MaxLen.l = 0
    ForEach Fonction()
      If Len(Fonction()) > MaxLen
        MaxLen = Len(Fonction())
      EndIf
    Next
    MaxLen + 3
    
  
    WriteStringN(hFileOut, ";- Automatic import")
    WriteStringN(hFileOut, #LFCR$ + #LFCR$)
    
    WriteStringN(hFileOut, #LFCR$ + "; Procedure GetFunction() edited !")
    WriteStringN(hFileOut, "Procedure.l " + #PB__GetFunctionMacro + "(hLib.l, FctName.s)")
    WriteStringN(hFileOut, "  Protected hExternProcedure.l")
    WriteStringN(hFileOut, "  hExternProcedure = GetFunction(hLib, FctName)")
    WriteStringN(hFileOut, "  If hExternProcedure = #Null")
    WriteStringN(hFileOut, "    MessageRequester(" + Chr(34) + "Error While importing function" + Chr(34) + ", " + Chr(34) + "Can't find : " + Chr(34) + " + FctName + " + Chr(34) + "()" + Chr(34) + ", #MB_ICONERROR)")
    WriteStringN(hFileOut, "  EndIf")
    WriteStringN(hFileOut, "  ProcedureReturn hExternProcedure")
    WriteStringN(hFileOut, "EndProcedure" + #LFCR$ + #LFCR$)
    
    
    WriteStringN(hFileOut, ";- Declare all fonctions")
    WriteStringN(hFileOut, "Declare " + #Fonction_Init + "(DLLName.s)")
    WriteStringN(hFileOut, "Declare " + #Fonction_UnInit + "()")
    ForEach Fonction()
      WriteStringN(hFileOut, "Declare " + Fonction() + "()")
    Next
    
    WriteStringN(hFileOut, #LFCR$ + #LFCR$ + ";- Declare all globals var")
    ForEach Fonction()
      WriteStringN(hFileOut, "Global *" + Fonction() + ".l")
    Next
    WriteStringN(hFileOut, "Global " + #hLibPointer + ".l")
    
    
    WriteStringN(hFileOut, #LFCR$ + #LFCR$ + ";- All functions wrapped")
    WriteStringN(hFileOut, "Procedure.l " + #Fonction_Init + "(DLLName.s)")
    WriteStringN(hFileOut, "  " + #hLibPointer + " = OpenLibrary(#PB_Any, DLLName)")
    WriteStringN(hFileOut, "  If " + #hLibPointer)
    ForEach Fonction()
      WriteStringN(hFileOut, "    *" + LSet(Fonction() + " = ", MaxLen, " ") + #PB__GetFunctionMacro + "(" + #hLibPointer + ", " + Chr(34) + Fonction() + Chr(34) + ")")
    Next
    WriteStringN(hFileOut, "  EndIf")
    WriteStringN(hFileOut, "  ProcedureReturn " + #hLibPointer)
    WriteStringN(hFileOut, "EndProcedure")
    
    WriteStringN(hFileOut, #LFCR$ + "Procedure " + #Fonction_UnInit + "()")
    WriteStringN(hFileOut, "  If " + #hLibPointer)
    WriteStringN(hFileOut, "    CloseLibrary("+#hLibPointer+")")
    WriteStringN(hFileOut, "  EndIf")
    WriteStringN(hFileOut, "EndProcedure")
    
    
    ForEach Fonction()
      WriteStringN(hFileOut, #LFCR$ + "; Function : " + Fonction() + "()")
      WriteStringN(hFileOut, "Procedure.l " + Fonction() + "()")
      WriteStringN(hFileOut, "  Protected ReturnValue.l")
      WriteStringN(hFileOut, "  ReturnValue = " + #PB__CallFunction + "(*"+Fonction()+")")
      WriteStringN(hFileOut, "  ProcedureReturn ReturnValue")
      WriteStringN(hFileOut, "EndProcedure")
    Next
    
    WriteStringN(hFileOut, #LFCR$ + #LFCR$ + "; ------------------------ Main --------------------")
    WriteStringN(hFileOut, "Debug " + #Fonction_Init + "(" + Chr(34) + GetFilePart(#FileDLL) + Chr(34) + ")")
    WriteStringN(hFileOut, #Fonction_UnInit + "()")
  
    
  Else
    MessageRequester("Attention", "Aucune fonction n'a été trouvée !", #MB_ICONWARNING)
  EndIf
  CloseFile(hFileOut)
EndIf
@++
Lionel
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !