![]() |
Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Hallo,
im Netz beziehen sich sehr viele Artikel zum Thema DLL und Delphi auf den Aufruf der DLLs aus Delphi - nun suche ich Tipps und best practices für den umgekehrten Fall: die DLL wird in Delphi erstellt und soll aus anderen Programmen (konkret Java) aufgerufen werden. Wie sieht es aus mit Speicherfreigabe z.B. für PChar und Byte Arrays, die an das aufrufende Programme übergeben werden, welche Seite ist dafür zuständig? Kann man Speicherlecks innerhalb der DLL zuverlässig aufspüren, z.B. mit FastMM4? Eventuell hat jemand einen Link auf einen kurzen Artikel für diesen Fall. Zur Zeit arbeite ich an einer kleinen Dokumentation zum Thema Java / Delphi Kommunikation über Java Native Access (JNA) - es funktioniert bisher problemlos, aber ich schreibe normalerweise keine DLLs und kenne die typischen Fallstricke nicht. Ich poste nachher noch ein paar Sourcecodebeispiele... |
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Es ist einfach immer derjenige für die Freigabe des Speicher zuständig, welcher diesen auch reserviert hat.
Wenn jetzt die Delphi-DLL speicher reserviert und diesen an Java abgibt, dann erstellt man einfach eine GibSpeicherFrei-Prozedur und exportiert diese. Dann kann das Java den Pointer an Delphi übergeben und dieses gibt dann den Speicher wieder frei. Zitat:
du brauchst in der DLL einfach nur FastMM einbinden (fals es nicht schon in Delphi drinnen ist) und dann die Speicherüberwachung aktivieren ... genauso wie in einer EXE |
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Hallo,
Zitat:
Gruß xaromz |
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Zitat:
Delphi-Quellcode:
Es wird ein neuer String als PChar zurückgegeben an das aufrufende Delphi Programm, vermutlich wurde in der Windows DLL der Speicher reserviert. Wie erfährt Windows, dass der String nicht mehr benutzt wird, und es ihn freigeben kann? Ich weiss, das ist sicher eine der typischen Anfängerfragen :)
function lstrcpy(lpString1, lpString2: PChar): PChar; stdcall;
|
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Nein, bei
![]() praktisch kannst du hier schön bei der WinAPI abgucken, denn da ist es meistens so: - Programm reserviert Speicher - Funktion kopiert Daten in diesen Speicher - Programm kümmert sich um die Freigabe des Speichers Ab und zu kommt es auch mal vor, daß die WinAPI den Speicher reserviert und dann eine weitere Funktion für die Freigabe anbietet. |
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Zitat:
Viele Grüße, |
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Zitat:
![]()
Delphi-Quellcode:
Die zweite Möglichkeit (Aufrufer fragt DLL zuerst wieviel Speicher reserviert werden soll) schaue ich mir dann noch an...
function Echo(const Arg: PChar): PChar; stdcall;
var Tmp: string; begin Tmp := Arg + ' Echo'; Result := StrAlloc(Length(Tmp)); StrCopy(Result, PChar(Tmp)); end; procedure FreeEcho(Arg: PChar); begin StrDispose(Arg); end; |
Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Es gibt noch eine dritte Möglichkeit.
Es ist festgelegt, wieviel Zeichen maximal zurückgegeben werden. Aufrufer stellt einen Puffer für die maximale Größe bereit, läßt sich den Inhalt denn rainkopieren und schaut danach nach, wieviel tatsächlich drinnen ist. also im Result, oder durch Messen oder ein Stoppzeichen (z.B. bei PChar's) oder in dem Rückgabewert steckt ein Record, wo die Größe mit drinnsteht. und die 4. ist der 2. ähnlich, nur daß es da keine Extra Funktion für die vorherige Längenabfrage gibt, sonder man einfach einen zukleinen oder keinen (NIL) Puffer übergibt und sich in der Fehlerauswertung die Länge mitteilen läßt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz