Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 06.05.08 10:43 
Hi,

es ist mal wieder das alte Thema. Ich bin gezwungen aus einer DLL längere Texte an das Programm und andersrum aus zu liefern. Hierbei kommt aber Sharemem nicht in Frage und da die DLL in wesentlichen von einer anderen Firma (in Delphi) implementiert werden soll, wir aber die Schnittstelle liefern müssen sollte es möglichst un aufwändig für die Jungs sein.

Normalerweise würde ich ja einfach pChar verwenden. Allerdings ist das ja auch nicht völlig unproblematisch wodurch man dann doch etwas mehr Aufwand treiben muss. Das möchte ich nach Möglichkeit von unserer Partnerfirma fern halten.

Kennt jemand von euch eine einfache Möglichkeit einen komplexeren Wert zu übergeben ohne einen Memory Manager einbinden zu müssen und ohne viel Aufwand zu treiben? Kann man da OLE-Typen missbrauchen oder ähnliches?

Ich habe zwar nicht viel Hoffnung aber vielleicht kennt Ihr ja einen Weg der mir helfen kann.

Gruß
Klabautermann
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 06.05.08 13:30 
Hallo Björn,

du kannst natürlich keine Speicherbereiche in der DLL erstellen und diese dann im Hauptprogramm frei geben wollen. So etwas sollte man der Struktur zu liebe auch nicht tun. Weswegen ich es mal dahingestellt lasse ob man der Seite auf about.com viel Aufmerksamkeit schenken sollte oder nicht, da ja aktiv der Speichermanager untergraben wird.

1 Möglichkeit: Für COM müsstest du dann vermutlich mit Interfaces arbeiten. Bzw müssten die Interfaces nicht mal unbedingt COM vorraussetzen sondern werden wie Objekte zurückgeliefert werden und geben sich selber frei. Was ja dann wieder im Coderaum der DLL geschehen würde. Dann hättest du aber Objekte in der Schnittstelle und die Tätigkeiten müssten dann wohl auch alle über die InterfacedObjects gelöst sein. Aber das ist bei mir schon eine Weile her deswegen lege ich meine Hand dafür nicht ins Feuer.

2 Möglichkeit: Du kannst es auch so machen, dass der Speicherbereich nicht von der DLL kommt sondern reingereicht werden muss. Bei NIL Pointern liefert die DLL die Größe zurück. Dann kann der Speicherbereich erstellt und übergeben werden. Das wird in der Windows API sehr häufig so gemacht.

3 Möglichkeit: Ich weiß nicht worum es sich dabei handelt aber du kannst es natürlich auch so machen, dass eine Create und Destroy Methode angeboten wird. Also mit Create wird in der DLL ein Objekt initialisiert und liefert die ID davon zurück. Die anderen Methode bekommen dann immer die ID gereicht und wissen auf welchem Objekt sie arbeiten. Alle Strings sind Teile dieses Objektes. Und Destroy zerstört das Objekt und gibt alle dazu gehörenden String wieder frei. Die ID kann entweder ein Eintrag in einer Liste sein oder direkt der Pointer des Objekts. Wenn du dann pChars zurück bekommst kannst du diese ruhigen Gewissens benutzen und anschließend ignorieren. Allerdings bei hochgradig dynamischen Texten könnte das evtl etwas umständlich werden.

Lossy

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 15.05.08 00:15 
Was spricht gegen FastMM?

BTW: bei den neueren Delphi Versionen (ich glaub ab 2005) wurde der Borland Memory Manager durch jenen von FastMM ersetzt (mit ein paar kleinen Änderungen) - bei neueren Delphi Versionen stellt sich dieses Problem also erst gar nicht..

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!