Programme C vers Delphi, pointeur et Access Violation
Bonjour,
J'ai ce code en C. Il s'agit d'un exemple en C fourni par un éditeur pour utiliser sa DLL:
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
|
typedef struct
{
//@{
double latitude;
double longitude;
//@}
double hpe;
unsigned short nap;
double speed;
double bearing;
WPS_StreetAddress* street_address;
unsigned short ncell;
unsigned short nsat;
double altitude;
WPS_LocationType type;
unsigned long age;
} WPS_Location;
WPSAPI_EXPORT WPS_ReturnCode WPSAPI_CALL
WPS_location(const WPS_SimpleAuthentication* authentication,
WPS_StreetAddressLookup street_address_lookup,
WPS_Location** location);
WPSAPI_EXPORT void WPSAPI_CALL
WPS_free_location(WPS_Location*);
WPS_Location* location;
rc = WPS_location(&authentication, WPS_NO_STREET_ADDRESS_LOOKUP,
&location);
if (rc != WPS_OK){
// traitement de l'échec....
}
else
{
// Traitement du succès ....
// Puis libération ressource
WPS_free_location(location);
} |
(A ce sujet, les //@{ //@} en début de structure ont-ils une signification ???)
Dans ce code, je ne vois aucune allocation de mémoire pour "location", qui n'est pourtant, sauf erreur, qu'un pointeur. J'en déduis que cette allocation est faite par l'appel de la fonction WPS_location(). Ensuite, WPS_free_location libère la mémoire allouée précédemment. Me trompe-je ?
Pourtant, si je traduis la chose sous delphi, j'ai un access violation si je ne fais pas un GetMemory sur le même pointeur (PLocation ici) avant d'appeler la même fonction :
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 53 54 55 56 57
|
type
TWPS_Location = record
latitude : double;
longitude : double;
hpe : double;
nap: word;
speed: double;
bearing: double;
street_addresse: PWPS_StreetAddress;
ncell: Word;
nsat: Word;
altitude: double;
loctype : WPS_LocationType;
age: LongInt;
end;
PTWPS_Location = ^TWPS_Location;
FWPS_location = function (
Pauthentication : PWPS_SimpleAuthentication;
street_address_lookup: WPS_StreetAddressLookup;
location: PPTWPS_Location):WPS_ReturnCode; cdecl;
FWPS_free_location = procedure (
location: PTWPS_Location) cdecl;
var
Plocation: PTWPS_location;
retour : WPS_ReturnCode;
WPS_location : FWPS_location;
WPS_free_location : FWPS_free_location;
Begin
DLLHandle := LoadLibrary(WpsDll);
@WPS_location := GetProcAddress(DLLHandle, 'WPS_location') ;
// Si je ne fais pas ça, ACCESS VIOLATION lors de l'appel à WPS_location() à la ligne suivante
Plocation := GetMemory(SizeOf(TWPS_location));
retour := WPS_location(@authentication, WPS_NO_STREET_ADDRESS_LOOKUP,@Plocation);
if retour <> WPS_OK then begin
// Traitement de l'échec
end
else begin
// Traitement du retour....
// Libération ressource
WPS_free_location(Plocation);
end;
// MAIS SI JE FAIS CA AUSSI : ACCESS VIOLATION dans le cas où WPS_free_location(Plocation); a déjà été appelée...
freememory(PLocation);
FreeLibrary(DLLHandle); |
Ne connaissant pas C, je pense que quelque chose m'échappe. Merci d'avance pour vos lumières.
André.