![]() |
DLL XE4 in Delphi 6 ohne sharemem
Morgen zusammen.
ich versuche gerade eine Delphi XE4 DLL in Delphi 6 aufzurufen. Ich habe dies auch schon einmal gemacht, aber ich bekomme es gerade nicht hin einen String zu übergeben und ich habe ehrlich gesagt keinen Plan warum es nicht geht. sharemem in beiden drin. Variablen Typ shortstring und auf der Seite der XE4 DLL kommt nur Datenmüll an. Meine Frage daher nun wie gehe ich das ganze an wenn ich es ohne sharemem machen wollte. Wie müssten beide Seiten aussehen damit ich Strings übergeben kann. Edit : ok das Problem hat sich erledigt. stdcall hat gefehlt. Aber die Frage bleibt bestehen um das sharemem wegzubekommen. |
AW: DLL XE4 in Delphi 6 ohne sharemem
Zitat:
PAnsiChar schaltet die automatische Speicherverwaltung für den String ab, es wird einfach ein Pointer auf das erste Zeichen übergeben. Jede Seite ist selbst dafür zuständig, das sauber zu implementieren (ist aber relativ einfach, eine Zuweisung auf Einen String reicht bzw. ein Typecast eines AnsiString auf PAnsiChar reicht). Bei WideString wird der Speicher von Windows verwaltet. Das ist langsamer, aber das fällt in der Regel kaum ins Gewicht. Und wie Du ja schon bemerkt hast: Wichtig ist, dass die Deklaration der Funktion auf beiden Seiten gleich ist, incl. der Calling-Convention. |
AW: DLL XE4 in Delphi 6 ohne sharemem
Ok danke. Werde ich einmal angehen.
|
AW: DLL XE4 in Delphi 6 ohne sharemem
[QUOTE=dummzeuch;1461374]
Zitat:
Ich hab auch schmerzlich feststellen müssen, das scheinbar die Länge von Records begrenzt ist ... wir hatten hier so ein Monster von 150 shortstrings. Der kam nicht ganz auf der anderen Seite an :lol: |
AW: DLL XE4 in Delphi 6 ohne sharemem
[QUOTE=stalkingwolf;1461583]
Zitat:
Zitat:
Die Anwendung soll gezielt den String aus der DLL laden, der gerade benötigt wird. Allternativ eine CallBack-Funktion als Parameter übergeben, die dem gerade benötigten String bei Bedarf bereitstellt. |
AW: DLL XE4 in Delphi 6 ohne sharemem
Zitat:
* entweder selbst festlegen, wie die sein soll, oder immer PACKED verwenden ![]() Ich bin mir aber ganz sicher dass es nicht am Record selbst lag, denn eine Grenze gibt es nicht. Record als CONST-Parameter (oder VAR) wird nur als Referenz übergeben, also garnichts kopiert. Ohne CONST/VAR/OUT wird der Value übergeben, also eine Kopie auf den Stack gegeben. Auch als lokale Variable liegt der Record auf dem Stack. Und wenn nicht genug Speicher auf dem Stack ist, dann knallt es, aber es wird garantiert nichts abgeschnitten. Übergeben wird jedenfalls definitiv immer alles, aber wenn auf beiden Seiten mit einer unterschiedlichen Speicherausrichtung oder unterschiedlichen Speichergrößen (Char, PChar, Integer/NativeInt, ...) gearbeitet wird, dann stimmen die Offsets im Record natürlich nicht. |
AW: DLL XE4 in Delphi 6 ohne sharemem
[QUOTE=Blup;1461590]
Zitat:
Zitat:
Klar man hat es sich zu einfach gemacht. Zitat:
Ich habe den Record zerlegt mit exakt den gleichen Typen und dann kommt auf der anderen Seite alles an, wenn ich jeden Rekord einzeln übergebe. Mittlerweile funktioniert alles so wie ich es will. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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