[D5] Handle de DLL identique pour tout les threads
Bonjour,
Dans le cadre d'un petit service d'impression, je lance mes éditions dans des threads (fonctionnement multitache).
Chaque thread effectue un loadlibrary (chargement dynamique) de ma dll qui s'occupe de l'édition.
Mais le handle de la dll est toujours le même dans chaque thread.
Est-ce normal ?
L'appel à GetProcAddress me donne donc certainement la même adresse pour la fonction 'imprimer'.
Au final, je me retrouve avec des violations d'accès lorsque 2 threads tournent en même temps. Ils doivent se mélanger les pinceaux.
N'est il pas possible d'avoir 2 instances bien séparées de la dll ?
Voici la structure principale de mon thread (code épuré)
Code:
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
|
unit SIEDIL01;
interface
uses
Windows, Classes, Sysutils, sinlibl01, forms, dbtables;
type
Tthread_edit = class(TThread)
private
{ Déclarations privées }
ch : string;
ImprimerThread : TImprimerThread;
protected
procedure Execute; override;
public
property Terminated;
constructor create(pserial, pch, pnompr : string);
end;
implementation
//-------------------------------------------------------------------------
constructor Tthread_edit.create(pserial, pch, pnompr: string);
begin
UHandle := 0;
FreeOnTerminate := true;
Priority := tpNormal;
ch := pch;
inherited create(false);
end;
//-------------------------------------------------------------------------
procedure Tthread_edit.Execute;
begin
try
try
retour := '';
UHandle := LoadLibrary('siimpd00.dll');
if UHandle <> 0 then begin
@ImprimerThread := GetProcAddress(UHandle, 'Imprimer');
if @ImprimerThread <> nil then begin
ImprimerThread(ch, retour) ;
end;
end;
except
end;
finally
FreeLibrary(UHandle);
end;
end;
//------------------------------------------------------------------------- |