Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Record aus DLL zurückgeben
Stoffel1984 - Mi 01.09.04 09:01
Titel: Record aus DLL zurückgeben
Hallo,
ich habe ein Form, welches in einer DLL "verpackt" ist.
In diesem Form fülle ich einen Record.
Die Aufruf Funktion der DLL zum anzeigen des Fensters soll schließlich den Record als Result zurückgeben.
Leider bekomme ich da immer eine Access Violation.
Weiß jemand an was das liegen könnte?
Bzw. habe ich was übersehen - Probleme bei Speicherbereichen o.ä.?
Danke schonmal,
Stoffel
Udontknow - Mi 01.09.04 09:29
Hallo!
Probiere es mal mit
SHAREMEM.
Cu,
Udontknow
Stoffel1984 - Mi 01.09.04 11:12
Hallo,
ich hab jetzt etwas mit ShareMem rumgespielt.
Allerdings möchte ich die Borland DLL nicht mitgeben.
Gibts da keine andere Möglichkeit?
Mit Pointern oder so?
Grüße, Stoffel
Motzi - Mi 01.09.04 11:55
Doch.. so wie in dem automatisch eingefügten Kommentar in der Dll steht:
Zitat: |
To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. |
Stoffel1984 - Mi 01.09.04 14:56
Ich habs befürchtet!
Mir wird nichts anderes übrigbleiben als PChars zu nehmen.
Trotzdem danke!
Neidhard von Reuental - Mi 01.09.04 19:04
ich benötige auch gerade etwas in der art. ich lad in meiner dll zum beispiel eine stringliste in den speicher und will der anwendung einen zeiger darauf übergeben.
wie könnt ich das aber nun realisieren?
und das ganze ohne sharemem.
hab mir schon mal überlegt den zeiger in ein longword umzuwandeln und in der anwendung zurück in einen zeiger. geht das überhaupt? :roll:
AndyB - Mi 01.09.04 23:47
Neidhard von Reuental hat folgendes geschrieben: |
hab mir schon mal überlegt den zeiger in ein longword umzuwandeln und in der anwendung zurück in einen zeiger. geht das überhaupt? :roll: |
Natürlich kannst du einen Zeiger in ein LongWord typecasten (zumindest auf 32-Bit Systemen). Aber bringen wird dir das auch nichts. Ob du die Adresse nun von der einen oder der anderen Seite betrachtest, ändert nichts an der Tatsache, dass es eine Adresse ist, die du vom Speichermanager bekommen hast. Und wenn du zwei Speichermanager am laufen hast (EXE und DLL), dann geht das beim Freigeben des Speichers trotzdem nach hinten los.
Es gibt aber mehrere Möglichkeiten, wie du das Problem umgehen kannst.
- Du bindest deine DLL zur Ladezeit (procedure xxx; external dllname;) und importierst den Speichermanager der DLL in die EXE (habe ich noch nie ausprobiert).
- Du alloziierst eine feste Adresse im Speicher, in der du den Record für die Speichermanagerfunktionen der EXE-Datei hinschreibst, und von der du beim Laden der DLL diese ausliest und den Speichermanager der DLL durch diese Funktionen ersetzt.
- Du setzt bei beiden (EXE und DLL) den Speichermanager auf den Speichermanager von C/C++ (malloc,free,realloc).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| unit CMemMan;
interface
procedure free(p: Pointer); cdecl; function malloc(Size: Integer): Pointer; cdecl; function realloc(p: Pointer; Size: Integer): Pointer; cdecl;
implementation
const msvcrt = 'msvcrt.dll';
procedure free(p: Pointer); cdecl; external msvcrt; function malloc(Size: Integer): Pointer; cdecl; external msvcrt; function realloc(p: Pointer; Size: Integer): Pointer; cdecl; external msvcrt;
function CGetMem(Size: Integer): Pointer; begin Result := malloc(Size); end;
function CFreeMem(p: Pointer): Integer; begin free(p); Result := 0; end;
function CReallocMem(p: Pointer; Size: Integer): Pointer; begin Result := realloc(p, Size); end;
const CMemoryManager: TMemoryManager = ( GetMem: CGetMem; FreeMem: CFreeMem; ReallocMem: CReallocMem; );
initialization SetMemoryManager(CMemoryManager);
finalization
end. |
Diese Unit musst du nur als aller erste Unit in der DLL und der EXE Datei einbinden (in der .dpr-Datei). Danach bist du von allen Speichermanager-Problemen bezüglich DLLs befreit.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!