1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
Interface
Function Dll_Navigateur_Web_Simple(Titre_,Url_:PChar;Modal:Boolean;Var Err_Ch:PChar):Boolean;
Implementation
Var Dll_List_Hdl:TStringList;
Procedure Dll_List_Hdl_Ajouter(FicDll,FctDll:String;Hdl:THandle);
Begin
If TObject_EstNil(Dll_List_Hdl)
Then Begin
Dll_List_Hdl := TSTringList.Create;
End;
If Pos('*'+IntToStr(Hdl)+'*',Dll_List_Hdl.Text) > 0 Then Exit;
Dll_List_Hdl.Add(FicDll+'*'+FctDll+'*'+IntToStr(Hdl)+'*');
End;
Function Dll_List_Hdl_Donner_Info_Num(Num:Integer;Var FicDll,FctDll:String;Var Hdl:THandle):Boolean;
Var
Ch,S,C,C1,C2,C3:String;
I:Integer;
Begin
Result := False;C1 := '';C2 := '';C3 := '';
Ch := DonnerElmNumDeTStrings(Num-1,Dll_List_Hdl);
C := Ch;
While C > '' Do
Begin
I := Pos('*',C);
If I > 1
Then Begin
S := CopierChDebFin(C,1,I-1);
Delete(C,1,I);
End
Else Begin
S := C;
C := '';
End;
If C1 = ''
Then C1 := S
Else
If C2 = ''
Then C2 := S
Else
If C3 = ''
Then C3 := S
Else Exit;
End;
FicDll := C1;
FctDll := C2;
Hdl := StrToInt(C3);
Result := (FicDll > '') And (FctDll > '') And (Hdl > 0);
End;
Function Dll_List_Executer(FicDll,FctDll:String;{Idx_Fct:Integer=-1;}Var Hdl:THandle):Pointer;
Begin
Result := Nil;ChMsgExcept := '';
//Chargement de la DLL. On récupère son handle
Hdl := LoadLibrary(pAnsiChar(FicDll));
//Si le chargement a échoué, on sort
If Hdl = 0
Then Begin
ChMsgExcept := 'LoadLibrary retourne zero pour '+QuotedStr(FicDll);
Exit;
End;
//On récupère l'adresse de la fonction voulue, que l'on renvoie
{If IndexFct < 0
then //Si l'index est négatif on utilise le nom sous forme de chaîne
Result := GetProcAddress(HandleDLL, pAnsiChar(NomFct))
else
//Sinon, on utilise l'index comme identifiant
Result := GetProcAddress(HandleDLL, pAnsiChar(IndexFct));
}
Result := GetProcAddress(Hdl,pAnsiChar(FctDll));
If (Result = Nil) Or (Not Assigned(Result))
Then Begin
ChMsgExcept := 'Echec chargement fonction '+QuotedStr(FctDll)+#13+'GetProcAddress à retourné zero';
Exit;
End;
Dll_List_Hdl_Ajouter(FicDll,FctDll,Hdl);
End;
Procedure Dll_List_Hdl_Detruire;
Var
Ch,FicDll,FctDll:String;
Hdl:THandle;
I:Integer;
Pt:TPoint;
Proc:Pointer;
Begin
Pt := Point(0,0);
Try
If TObject_EstPasNil(Dll_List_Hdl)
Then Begin
Pt.Y := Dll_List_Hdl.Count;
While Dll_List_Hdl.Count > 0 Do
Begin
Inc(Pt.X);Proc := Nil;
If Pt.X > Pt.Y Then Break;
If Dll_List_Hdl_Donner_Info_Num(1,FicDll,FctDll,Hdl)
Then Begin
Try
If Hdl <> 0
Then FreeLibrary(Hdl);
Except
DonnerChMsgExcept;
End;
End;
Try
Dll_List_Hdl.Delete(0);
Except
I := -1;
DonnerChMsgExcept;
End;
End;//While Dll_List_Hdl.Count > 0 Do
End;
Finally
DetruireCeTObject(Dll_List_Hdl);
End;
End;
Function Dll_Navigateur_Web_Simple(Titre_,Url_:PChar;Modal:Boolean;Var Err_Ch:PChar):Boolean;
Const
FicDll = 'Dll_TWebBrowser.Dll';
FctDll = 'Dll_Navigateur_Web_Simple';
Var
Dll_Fct:Function(Titre_,Url_:PChar;Modal:Boolean;Var Err_Ch:PChar):Boolean;StdCall;
Hdl:THandle;
Begin
Result := False;
Dll_Fct := Dll_List_Executer(FicDll,FctDll,Hdl);
If Not Assigned(Dll_Fct)
Then Begin
Exit;
End;
Result := Dll_Fct(Titre_,Url_,Modal,Err_Ch);
End;
Initialization
Dll_List_Hdl := Nil;
If UDGn1PasInit Then InitUDGn1;
Finalization
Dll_List_Hdl_Detruire;
End. |
Partager