Tengo un DLL que proporciona una función de decodificación, como sigue:Pre-asignar memoria entre HostApp y DLL
function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall;
El HostApp llaman "MyDecode", y la transfiere en los parámetros de la fuente, SourceLen y Dest, la La DLL devuelve Dest y DestLen decodificados. El problema es que la HostApp no puede saber la longitud del Dest decodificada, y por lo tanto no sabría cómo preasignar la memoria de Dest.
sé que puede dividir "MyDecode" en dos funciones:
function GetDecodeLen (Source: PChar; SourceLen: Integer): Integer; stdcall; // Return the Dest's length
function MyDecodeLen (Source: PChar; SourceLen: Integer; var Dest: PChar): Boolean; stdcall;
Pero, Mi proceso de decodificación es muy complicado, por lo que si se divide en dos funciones afectará a la eficacia.
¿Existe una solución mejor?
Sí Alexander, esta puede ser una buena solución. código HostApp:
//...
MyDecode(....)
try
// Use or copy Dest data
finally
FreeDecodeResult(...)
end;
código 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;
Tal vez debería cambiar el tipo de Dest al puntero.
¿Cuál es un mejor método de memoria asignada? GetMem/New o HeapAlloc?
¿Qué problema está tratando de resolver ?: 1) cómo calcular la cantidad a asignar por adelantado; 2) cómo coordinar la gestión de la memoria dinámica entre la persona que llama y la persona que llama? –
Para Marcelo: 1) La persona que llama no puede determinar la cantidad a asignar por adelantado. 2) Sí. – Leo
> ¿Cuál es un mejor método de memoria asignada? En su caso, esto no importa. Utiliza el método con el que estás familiarizado (prefiero GetMem/FreeMem). – Alex