Ich habe eine DLL, in der ich eine Funktion habe, die ein pchar zurückgibt. (um zu vermeiden, borlndmm zu benutzen) Was ich ursprünglich gemacht habe, war, eine Zeichenkette als pchar zu werfen und das zurückzugeben
%Vor%Aber ich bekam die erwarteten Ergebnisse 90% der Zeit und die anderen Male würde ich nichts zurückbekommen.
Ich dachte dann, dass ich den Speicher für den pchar zuweisen musste, und dass es meine ursprüngliche Art war, einen pchar-Punkt in Erinnerung zu haben, der nicht immer sein würde, wenn die Funktion ursprünglich aufgerufen wurde. Also ich habe jetzt das
%Vor%Aber das bringt mich dazu, den zugewiesenen Speicher auf dem Programmende zu bereinigen, was ich mit
mache %Vor%Die $ 64-Frage lautet also: Muss ich Speicher reservieren, wenn ich einen PChar von einer Funktion innerhalb einer DLL zurückgebe oder kann ich ihn einfach auf einen PChar umwandeln?
Der typische Ansatz für dieses Problem besteht darin, dass die App den Speicher reserviert und dann an die DLL zum Ausfüllen weitergibt (besser noch, wenn die DLL der App ermöglicht, abzufragen, wie viel Speicher sie reservieren muss Speicher zu überschreiben):
%Vor%Dies ermöglicht der App zu entscheiden, wann und wie der Speicher zugewiesen werden soll (Stack versus Heap, Wiederverwendung von Speicherblöcken usw.):
%Vor%Wenn dies keine Option für Sie ist, dann muss die DLL den Arbeitsspeicher reservieren, zur Verwendung an die App zurückgeben und die DLL eine zusätzliche Funktion exportieren lassen, die die App aufrufen kann, wenn sie fertig ist Übergeben Sie den Zeiger zurück an die DLL zur Freigabe:
%Vor%DLL und Ihre Haupt-App haben zwei verschiedene Speichermanager, daher ist es inkorrekt, Speicher in DLL zu reservieren, aber in der Haupt-App freizugeben und umgekehrt.
Sie können den WideString-Typ verwenden, um einen String aus dll zurückzugeben oder ihn an dll zu übergeben. WideString ist ein Wrapper um den System-BSTR-Typ und Speicher für WideString-Variablen wird automatisch vom Systemspeichermanager zugewiesen.
Eine andere Lösung ist die Verwendung von SimpleShareMem anstelle von ShareMem (nur Delphi 2007 und älter) - es funktioniert wie ShareMem, benötigt aber keine borlnmm.dll-ähnlichen Bibliotheken zur Neuverteilung.
Wenn Sie eine Zeichenfolge als PChar von der Funktion zurückgeben, wird die Zeichenfolge im Stapel gehalten, weshalb sie manchmal beschädigt ist. Ich benutze Prozess-Heap-Speicher für die Rückgabe von Zeichenfolgen oder Zeiger auf globale Puffer-Array von Zeichen.
Sie können auch einen eingebauten Assembler verwenden und dies tun:
%Vor%Tags und Links dll delphi delphi-2007 pchar