J'ai une DLL qui fournit une fonction de décodage, comme suit :
function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall;
Le HostApp appelle "MyDecode", et transfère dans les paramètres Source, SourceLen et Dest, la DLL renvoie les paramètres décodés Dest et DestLen. Le problème est le suivant : L'application hôte ne peut pas connaître la longueur de Dest décodé, et ne sait donc pas comment pré-allouer la mémoire de Dest.
Je sais que l'on peut diviser "MyDecode" en deux fonctions :
function GetDecodeLen (Source: PChar; SourceLen: Integer): Integer; stdcall; // Return the Dest's length
function MyDecodeLen (Source: PChar; SourceLen: Integer; var Dest: PChar): Boolean; stdcall;
Mais mon processus de décodage est très compliqué, donc s'il est divisé en deux fonctions, l'efficacité en sera affectée.
Existe-t-il une meilleure solution ?
Oui, Alexander, c'est peut-être une bonne solution. Code HostApp :
//...
MyDecode(....)
try
// Use or copy Dest data
finally
FreeDecodeResult(...)
end;
Code DLL :
function MyDecode(...): Boolean;
begin
// time-consuming calculate
// Allocate memory
GetMem(Dest, Size);
// or New()?
// or HeapAlloc()?
end;
procedure FreeDecodeResult(Dest: PChar);
begin
FreeMem(Dest);
// or Dispose(Dest); ?
// or HeapFree(Dest); ?
end;
Je devrais peut-être changer le type de Dest en Pointeur.
Quelle est la meilleure méthode d'allocation de mémoire ? GetMem/New ou HeapAlloc ?