AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DLL XE4 in Delphi 6 ohne sharemem

Ein Thema von stalkingwolf · begonnen am 6. Apr 2020 · letzter Beitrag vom 9. Apr 2020
Antwort Antwort
stalkingwolf

Registriert seit: 6. Mai 2011
516 Beiträge
 
#1

DLL XE4 in Delphi 6 ohne sharemem

  Alt 6. Apr 2020, 10:37
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.

Geändert von stalkingwolf ( 6. Apr 2020 um 10:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.449 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: DLL XE4 in Delphi 6 ohne sharemem

  Alt 6. Apr 2020, 10:51
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.
Wenn Du Strings ohne ShareMem übergeben willst (bzw. wenn das auch über verschiedene Delphi-Versionen hinweg funktionieren soll, denn die Implementation von ShareMem hat sich geändert, genaus wie der Default-String-Typ), bleiben Dir zwei Optionen:
  1. PAnsiChar
  2. WideString

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.
Thomas Mueller
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
516 Beiträge
 
#3

AW: DLL XE4 in Delphi 6 ohne sharemem

  Alt 6. Apr 2020, 13:46
Ok danke. Werde ich einmal angehen.
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
516 Beiträge
 
#4

AW: DLL XE4 in Delphi 6 ohne sharemem

  Alt 8. Apr 2020, 11:57
[QUOTE=dummzeuch;1461374]
Bei WideString wird der Speicher von Windows verwaltet. Das ist langsamer, aber das fällt in der Regel kaum ins Gewicht.
Bei WideString bekomme ich eine Zugriffsverletzung, sobald ich die DLL Funktion aufrufe.

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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: DLL XE4 in Delphi 6 ohne sharemem

  Alt 8. Apr 2020, 12:51
[QUOTE=stalkingwolf;1461583]
Bei WideString wird der Speicher von Windows verwaltet. Das ist langsamer, aber das fällt in der Regel kaum ins Gewicht.
Bei WideString bekomme ich eine Zugriffsverletzung, sobald ich die DLL Funktion aufrufe.
Selbstverständlich müssen dann beide Seiten die Funktionen bzw. Parameter und Rückgabewerte mit WideString delarieren und verwenden (DLL und Anwendung).

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
Wer macht den so was? Wenn es sich um konstante Strings handelt, kann man diese als Resoutce in der DLL anlegen.
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: DLL XE4 in Delphi 6 ohne sharemem

  Alt 8. Apr 2020, 16:07
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
Eventuell war es was mit der Speicherausrichtung in den records.
* entweder selbst festlegen, wie die sein soll, oder immer PACKED verwenden
http://docwiki.embarcadero.com/RADSt...ields_(Delphi)

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

Registriert seit: 6. Mai 2011
516 Beiträge
 
#7

AW: DLL XE4 in Delphi 6 ohne sharemem

  Alt 9. Apr 2020, 08:38
[QUOTE=Blup;1461590]
Bei WideString wird der Speicher von Windows verwaltet. Das ist langsamer, aber das fällt in der Regel kaum ins Gewicht.
Bei WideString bekomme ich eine Zugriffsverletzung, sobald ich die DLL Funktion aufrufe.
Selbstverständlich müssen dann beide Seiten die Funktionen bzw. Parameter und Rückgabewerte mit WideString delarieren und verwenden (DLL und Anwendung).
Das ist klar. Kracht dennoch.

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
Wer macht den so was? Wenn es sich um konstante Strings handelt, kann man diese als Resoutce in der DLL anlegen.
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.
Der Grund ist das dieser riesige Record damals wegen unser BPL erstellt wurde. Es werden alle nötigen Daten hineingepackt und dann der Record an die BPL übergeben, da diese nicht auf Datenbank zugreifen kann. und so wurde das Ding immer größer und größer und war dann irgendwann dieses Monster.
Klar man hat es sich zu einfach gemacht.

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.
Doch es kam nur ca 1/3 an. Nichts verschoben oder ähnliches. Wie gesagt für unsere BPL funktioniert das.
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:47 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