Page 1 sur 1

Importer les fonctions d'une DLL

Publié : sam. 21/avr./2007 19:31
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