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