AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DLL mit Strings von D10 nach Delphi 6
Thema durchsuchen
Ansicht
Themen-Optionen

DLL mit Strings von D10 nach Delphi 6

Ein Thema von kmma · begonnen am 25. Okt 2023 · letzter Beitrag vom 27. Okt 2023
Antwort Antwort
kmma

Registriert seit: 26. Jul 2010
9 Beiträge
 
Delphi 2 Desktop
 
#1

DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 15:29
Ich habe eine DLL in Delphi 10 die eien String zurückgeben soll. Das ganze soll (muss) in einer D6 Anwendung geladen wewrden.
sharemem ist als erstes in den uses eingebunden, der String ist als ansistring definiert.

Der String wird zwar in D6 richtig angezeigt, beim Beenden der Funktion kommt es aber zu einem Speicherzugriffsfehler.
Was ist da noch zu beachten?

In Delphi 10:
function ExportString: ansistring; export;
begin
result := 'Hallo'
end;

In D6:

procedure TForm1.Button1Click(Sender: TObject);
type TStringFunction = function: ansistring;
var StringFunction: TStringFunction;
h: hmodule;
p: pointer;
begin
h := LoadLibrary(pchar('s:\D\Delphi\Test.dll'));
if h <> 0 then
begin

p := GetProcAddress(h, 'ExportString');
form1.tag := integer(p);
@StringFunction := p;
form1.caption := StringFunction; // Klappt noch

end;
end; // hier kracht es
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

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

AW: DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 15:46
Ich bin mir ziemlich sicher, dass Sharemem von Delphi 10 und Sharemem von Delphi 6 nicht kompatibel sind. Deshalb müsstest Du auf PAnsiChar oder WideString umstellen.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.173 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 16:26
Ich habe eine DLL in Delphi 10 die eien String zurückgeben soll. Das ganze soll (muss) in einer D6 Anwendung geladen wewrden.
sharemem ist als erstes in den uses eingebunden, der String ist als ansistring definiert.

Der String wird zwar in D6 richtig angezeigt, beim Beenden der Funktion kommt es aber zu einem Speicherzugriffsfehler.
Was ist da noch zu beachten?
3 Möglichkeiten:
a, Entweder baust du eine C-Kompatible Schnittstelle. Also kein AnsiString sondern P(Ansi)Char und Co
b, Exe und DLL sind mit der gleichen Delphi-Version erstellt
c, Du nutzt WideString, so das hier die Speicherverwaltung von Windows genutzt wird und kein Probleme mit
2 Speichermanagern in D6 und D100 auftauchen
Das gibt es auch unter D6, da sonst kein COM genutzt werden könnte.

Ich würde die auch empfehlen komplett von D6 weg zu kommen.
Die Produktivität von D10(.4 bei uns) ist sehr viel höher als mit D6.
Ich würde keinen Job mehr mit D6 anfangen wollen (außer die erste Aufgabe wäre Update auf aktuelles Delphi)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 17:22
Strings wurden im Jahre 2009 intern umgebaut. Aktuelle "LongStrings" haben zwei Felder mehr. (der Offset zwischen String-Zeiger und Speicher-Block hat sich verschoben)
Außerdem mußt du mit der Speicherverwaltung aufpassen -> Shared Memory.

Hier ein paar Threads, unter Anderem auch diesbezüglich,
wo ich zuletzt auch damit gekämpft hatte, zwischen Delphi 7 und 11.3.
https://www.delphipraxis.net/213732-...n-gesucht.html
https://www.delphipraxis.net/213691-...-methoden.html
https://www.delphipraxis.net/213736-...-fuer-neu.html

Fazit: Nimm WideString, ShortString, PChar PAnsiChar/PWideChar oder andere CharArrays.
Ebenso ginge OleVariant .... nicht Variant, da Letzteres ebenfalls die LongStrings enthält, wobei vor 2009 das Delphi den UnicodeString nicht kennt.

WideString kapselt den BSTR (OLE-String), also dessen WinAPI der OleAut32.dll, aka MSDN-Library durchsuchenSysAllocString usw.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Okt 2023 um 17:28 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.856 Beiträge
 
Delphi 12 Athens
 
#5

AW: DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 17:41
Außer der Empfehlung auch von meiner Seite von D6 weg zu kommen noch der hinweis,
dass man sicherheitshalber auch eine Calling Convention bei der Deklaration der Funktion
in der DLL und im aufrufenden Programm angeben sollte. z. B. StdCall.
Nich dass da mal wer unbedacht dran schraubt...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 17:47
Oder explizit "register" als Calling-Convention hinschreiben.

Nein, "pascal" ist nicht das, was Delphi standardmäßig benutzt, auch wenn es danach klingen mag.
https://docwiki.embarcadero.com/RADS...l_und_safecall



Und unter Win64 ist es eh egal, da es dort nur noch eine Convention gibt
und sämtliche Compiler alle Angaben einer Convention ignorieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
kmma

Registriert seit: 26. Jul 2010
9 Beiträge
 
Delphi 2 Desktop
 
#7

AW: DLL mit Strings von D10 nach Delphi 6

  Alt 25. Okt 2023, 19:48
Danke erstmal für die Antworten. Das Problem ist, dass ich an der D6 Seite nichts machen kann, die Anwendung ist da und soll so bleiben (außerhalb meines Einflußbereiches).
Natürlich könnte ich die DLL in D6 erstellen, aber zum einen will ich ja hin zu D10, außerdem gibt es da ein paar sehr nette Funktionen in D10, die ich für diese Aufgabe gut gebrauchen kann.

Ich habe jetzt ein wenig experimentiert und eine "Lösung" gefunden, die zumindest in der kleinen Testumgebeung funktioniert. Jetzt würde ich gerne wissen, ob das Zufall ist und bei anderen Konstllation auch zu Abstürzen führt oder ob das zwar prinzipiell sehr unsauber programmiert ist, aber der Zweck heiligt die Mittel.

Also wie gesagt an der D6 Seite kann/will/darf ich nicht ändern.
Da gibt es einfach die Funktion (vereinfacht)
Code:
 
type TStringFunction = function: string;
Ich habe jetzt die D10 Funktion so umgebaut dass ich quasi einen Widestring als Container für einen Ansistring missbrauche. Je nach Länge des zu übergebenden Strings wird eben am Ende ein #0 mit übermttelt, aber das wäre in der D6 Anwendug kein Problem.
Code:
function ExportString: widestring; Export;
  var Ansi: ansistring;
begin
  ansi := 'Hallo';
  setlength(result, (length(ansi) div 2) + (length(ansi) mod 2));
  fillchar(result[1], 2 * length(result), 0);
  move(ansi[1], result[1], length(ansi));
//  result := 'hallo';
end;
Jedenfalls kommt in der D6 Anwendung ein "Hallo" +#0 an. Die Frage ist jetzt eben, ob ich da nur zufälligerweise keine Speicherverletzung erlebe oder ob das prinzipiell so gehen kann.
  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 13:53 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