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; //-------------------------------------------------------------------------
