Salut a tous,
je suis en train de migrer une application D7 en XE4, et je me trouve logiquement confronté à un problème de string, mais je n'arrive pas a comprendre pourquoi.
Le contexte de base :
Une application D7 (en migration) utilise une dll D7 d'une autre application (non migrée) pour obtenir des informations. Ces 2 parties utilisent SharMem.
Là où ca se corse, c'est sur le prototype des fonctions (ce n'est pas le vrai proto, mais le problème est présent):
J'aimerai, dans la mesure du possible, ne pas avoir a toucher a la dll car elle est fournie avec un autre produit et je préférerai qu'elle reste telle quelle.
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 type TInfo = record txt: string; end; PInfo = ^TInfo; function GetInfo(): PInfo; external 'madll.dll'; ... var p: PInfo; begin p := GetInfo; ShowMessage(PAnsiChar(p^.txt)); Dispose(p); end;
Pour la migration, j'ai donc renommé String en AnsiString.
Lorsque j’exécute cette fonction en XE4, j'obtiens une violation d'accès lors du dispose (lecture de l'adresse 0), alors que je n'ai pas le problème en D7.
Le code de la fonction de la dll (D7) est le suivant :
Si je passe la variable s en globale, je n'ai plus la V.A. dans l'exe, j'en déduis que si j'ai encore une référence sur ma chaine au moment du Dispose, ca ne pose pas de problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function GetInfo(): PInfo; var s: string; begin New(Result); s := stringofchar('c', 4) + inttostr(4); //pour etre sur de ne pas avoir une chaine constante Result^.txt := s; end;
Je soupçonne donc
* soit une libération impromptue de la chaine qui fait qu'elle est libérée une deuxième fois lors du Dispose,
* soit que la libération par l'exe de la chaine allouée par la dll pose problème.
Quelqu'un aurait-il une piste à me donner pour comprendre cette erreur (une autre réponse que "ne pas retourner pointeur avec des string", car ca je n'ai pas trop la main dessus).
Petite remarque : même après lecture de l'article le Paul, et plusieurs tentatives de cast/encode de ma chaine, je n'ai réussi a voir la chaine que en castant en PAnsiChar ou dans l'evaluateur, sinon elle apparait vide.
Merci.
Partager