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 :

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';
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
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;
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?

Merci d'avance.