Ich habe eine DLL, die eine Decodierungsfunktion vorgesehen, wie folgt:vorbelegen Speicher zwischen HostApp und DLL
function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall;
Die HostApp nennen „MyDecode“ und übertragen in die Quelle, SourceLen und Dest Parameter, die DLL gibt decodiertes Dest und DestLen zurück. Das Problem ist: Die HostApp unmöglich decodierte Dest-Länge zu wissen, und daher nicht wissen, wie Dest Speicher vorab zugewiesen werden.
Ich weiß, dass „MyDecode“ in zwei Funktionen aufgeteilt werden:
function GetDecodeLen (Source: PChar; SourceLen: Integer): Integer; stdcall; // Return the Dest's length
function MyDecodeLen (Source: PChar; SourceLen: Integer; var Dest: PChar): Boolean; stdcall;
Aber, Mein Decodierungsprozess sehr kompliziert, so dass, wenn in zwei Funktionen aufgeteilt wird die Effizienz beeinflussen.
Gibt es eine bessere Lösung?
Ja Alexander, das kann eine gute Lösung sein. HostApp Code:
//...
MyDecode(....)
try
// Use or copy Dest data
finally
FreeDecodeResult(...)
end;
DLL-Code:
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;
Vielleicht sollte ich Dest den Typ Pointer ändern.
Welches ist eine bessere Speicherzuweisungsmethode? GetMem/New oder HeapAlloc?
Welches Problem versuchen Sie zu lösen: 1) wie Sie den im Voraus zuzuteilenden Betrag ermitteln; 2) Wie man dynamische Speicherverwaltung zwischen Anrufer und Angerufenem koordiniert? –
Um Marcelo: 1) Anrufer kann den Betrag im Voraus nicht zuordnen. 2) Ja. – Leo
> Was ist eine bessere Speicherzuweisungsmethode? In Ihrem Fall spielt dies keine Rolle. Verwenden Sie die Methode, mit der Sie vertraut sind (Ich bevorzuge GetMem/FreeMem). – Alex