Bonjour,
J'utilise une application Delphi 7 pour appeler une DLL qui a été réalisée en C++ (Je ne possède pas les sources de cette DLL, uniquement les en-têtes).
La dll me fournit les éléments suivant :
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 typedef struct{ UINT instrNumber; USHORT bond; BSTR dongleAddress; BSTR macAddress; BSTR name; ConnectionState state; TypeDeviceBluetooth typeDeviceBt; TypeInstrument type; USHORT writeHandle; }BTInstrument; extern "C" MADLL_API UINT __stdcall getNumberInstrFound(UINT dongleNumber); extern "C" MADLL_API bool __stdcall getFoundBTInstr(UINT dongleNumber, UINT indexInstr, BTInstrument* instr);
Dans mon application Delphi, j'ai redéfini les éléments suivants :
Pour tester le tout, j'ai fait l'appel suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Type TBTInstrument = Record instrNumber : Cardinal; {UINT} bond : Word; {USHORT} dongleAddress : pWideChar;{BSTR} macAddress : pWideChar; name : pWideChar; state : TConnectionState; typeDeviceBt : TTypeDeviceBluetooth; typeI : TTypeInstrument; writeHandle : Word; End; function getNumberInstrFound(dongleNumber: Cardinal): Cardinal stdcall; Procedure getFoundBTInstr(dongleNumber: Cardinal; indexInstr: Cardinal; Out instr: TBTInstrument) stdcall; function getNumberInstrFound; stdcall;external 'MADLLdll.DLL'; Procedure getFoundBTInstr; stdcall;external 'MADLLdll.DLL';
La valeur de NbInstr est à 3, ce qui est étrange c'est que lors de l'appel à "getFoundBTInstr", ma variable "IInstruments" qui est ma variable de boucle, se réinitialise à 0, je me retrouve donc avec une boucle sans fin. J'ai essayé en utilisant une variable intermédiaire comme paramètre, rien n'y fait. on dirait que l'appel à "getFoundBTInstr" empiète sur des plages mémoire de mon application et écrase certaines variables que j'utilise. Est-ce possible? comment protéger un environnement mémoire, ou comment résoudre ce genre de problème?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Procedure Test; Var IInstruments : Integer; CurrentInstr : TBTInstrument; Begin NbInstr:=getNumberInstrFound(0); For IInstruments:=0 To NbInstr-1 Do Begin getFoundBTInstr(0,IInstruments,CurrentInstr) ShowMessage(CurrentInstr.macAddress); End; End;
Merci d'avance.
Partager