Basic Univers
; 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