Bonjour,
J'ai ce code en C. Il s'agit d'un exemple en C fourni par un éditeur pour utiliser sa DLL:
(A ce sujet, les //@{ //@} en début de structure ont-ils une signification ???)
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
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); }
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 :
Ne connaissant pas C, je pense que quelque chose m'échappe. Merci d'avance pour vos lumières.
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
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);
André.
Partager