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):
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;
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.

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 :
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;
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
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.