AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speicherfreigabe in Delphi DLL (Aufruf aus Java)
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherfreigabe in Delphi DLL (Aufruf aus Java)

Ein Thema von mjustin · begonnen am 10. Nov 2009 · letzter Beitrag vom 15. Nov 2009
Antwort Antwort
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#1

Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 10. Nov 2009, 11:15
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...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 10. Nov 2009, 11:21
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 von mjustin:
Kann man Speicherlecks innerhalb der DLL zuverlässig aufspüren, z.B. mit FastMM4?
joar

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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 10. Nov 2009, 11:27
Hallo,
Zitat von himitsu:
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.
wobei ich anmerken möchte, dass es üblich ist, dass der Host Speicher reserviert und der DLL zur Verfügung stellt. Dadurch spart man sich den Aufruf einer expliziten Speicherfreigabe über die DLL. Nachteil ist, dass man vorher die DLL fragen muss, wie viel Speicher die entsprechende Funktion braucht. Wenn das vorher nicht klar ist, funktioniert dieser Weg natürlich nicht.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 10. Nov 2009, 11:31
Zitat von himitsu:
Es ist einfach immer derjenige für die Freigabe des Speicher zuständig, welcher diesen auch reserviert hat.
wie funktioniert es bei DLL-Aufrufen von Funktionen der Windows API, z.B. in Windows.pas wird eine kernel32 Funktion so deklariert:

function lstrcpy(lpString1, lpString2: PChar): PChar; stdcall; 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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 10. Nov 2009, 11:50
Nein, bei MSDN-Library durchsuchenlstrcpy mußt du den Speicher vorher reservieren und diese Funktion kopiert dann den String in diesen Speicher.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 10. Nov 2009, 12:05
Zitat von himitsu:
Nein, bei MSDN-Library durchsuchenlstrcpy mußt du den Speicher vorher reservieren und diese Funktion kopiert dann den String in diesen Speicher.
Danke für den Link - alles ist nun etwas klarer geworden

Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 15. Nov 2009, 10:22
Zitat von himitsu:
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.
Ok, also zum Beispiel so (frei nach http://www.codexterity.com/memmgr.htm)

Delphi-Quellcode:
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;
Die zweite Möglichkeit (Aufrufer fragt DLL zuerst wieviel Speicher reserviert werden soll) schaue ich mir dann noch an...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

Re: Speicherfreigabe in Delphi DLL (Aufruf aus Java)

  Alt 15. Nov 2009, 13:29
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz