Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String aus D5 DLL in Delphi 10.2 einslesen (https://www.delphipraxis.net/201351-string-aus-d5-dll-delphi-10-2-einslesen.html)

kmma 15. Jul 2019 08:59

String aus D5 DLL in Delphi 10.2 einslesen
 
Hallo

Ich habe folgendes Problem. Ich muss eine D5 DLL in ein D10.2 Projekt einbiden. An der D5 DLL kann ich nichts meh ändern. Die DLL übergibt einen String (böse :-)

Ich habe das ganze mal auf folgende Minimalkostellation zusammengestaucht um das Problem zu zeigen.

D5 DLL

(Sharemem ist als erstes in der Uses Klausel)

Delphi-Quellcode:
library Project_d5;

uses
  sharemem,
  SysUtils,
  Classes;

function ExportString: string; export; forward;

function ExportString: string;
begin
   result := 'Hallo';
end;

exports
    ExportString;
end.
in D10.2:

Delphi-Quellcode:
unit DLL_string;

interface

uses
  sharemem, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

function ExportString: ansistring stcall; external 'xxx\Project_d5.dll';

var
  Form1: TForm1;

implementation

procedure TForm1.FormCreate(Sender: TObject);
  var a: shortstring;
begin
  a := Exportstring;
  showmessage(a);

end;
Beim Start wird zwar "Hallo" agezeigt, aber wenn die die Prozedur FormCreate verlassen wird, wirft das Programm eine Exception.

Hat jemand eine Idee, wie ich Strings aus D5 DLLs sauber einlesen kann?

PS. Falls das klappen sollte steht mir auch noch die Aufgabe bevor, StringLists aus D5 weier zu verarbeiten :-(


Gruß Klaus

MyRealName 15. Jul 2019 09:12

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Ist schon 20 jahre her, aber war da nicht was mit nach D5 wurde die Standard-Aufruf-Konvention für DLLs geändert, die Delphi nutzt, wenn nichts angegeben wurde ? Vllt. liegt es ja daran

jziersch 15. Jul 2019 10:02

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Wenn beim verlassen eine Exception kommt liegt es vermutlich am FreeMem bzw. RefCounter auf den String.

Probier mal einen PAnsiChar abzufragen und den String damit auszuwerten.
In den 8 bytes vor der Referenz sollte sich die Länge und der Referenz Zähler befinden.

kmma 15. Jul 2019 10:45

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Danke für die Antwort.
Ja, die Exception kommt beim Verlassen der Procedur. Aber wie soll ich das als pchar abfragen?

Ich habe mal folgendes testweise gemacht:

procedure TForm1.FormCreate(Sender: TObject);
begin
Exportstring;

end;

(Also nur die Prozedur aufrufen und das Ergebnis ignorieren), auch das wirft die Exception beim Verlassen der Prozedur.

jziersch 15. Jul 2019 11:21

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
ich meinte dies:

function ExportString: PAnsiChar stcall; external 'xxx\Project_d5.dll';

und mal sehen was Du mit dem Pointer machen kannst.

Auf diese Weise wird ShareMem etc. nicht benötigt.

EWeiss 15. Jul 2019 11:30

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Zitat:

Zitat von jziersch (Beitrag 1436759)
ich meinte dies:

function ExportString: PAnsiChar stcall; external 'xxx\Project_d5.dll';

und mal sehen was Du mit dem Pointer machen kannst.

Auf diese Weise wird ShareMem etc. nicht benötigt.

Sieht seltsam aus.. stcall nicht stdcall ?

gruss

Codehunter 15. Jul 2019 11:40

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Soweit ich mich erinnere ging das mit den String-Rückgaben bei D5 ausschließlich in Verbindung mit Sharemem und/oder FastMM4. Daher würde ich orakeln, dass der Speichermanager von Tokio krachen geht. Evtl. hilft es, die DLL dynamisch (spät) zu laden und nach Gebrauch auch gleich wieder freizugeben.

hoika 15. Jul 2019 12:02

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Hall,
laß unter D10 einfach mal das stdcall weg.

Rolf Frei 15. Jul 2019 12:02

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Du deklarierst die Funktion mit einem Rückgabewert als AnsiString. In deiner Anwendung nutzt du aber einen ShortString. Nutze den selben StringtTyp in der Anwendung, also AnsiString. ShortString und AnsiString sind intern komplett anderes aufgebaut und ich kann mir gut vorstellen, dass es deswegen zu einer AV kommt.

hoika 15. Jul 2019 12:07

AW: String aus D5 DLL in Delphi 10.2 einslesen
 
Hallo,

Zitat:

ShortString und AnsiString sind intern komplett anderes aufgebaut
Ausprobieren.
Sobald das falsche (denke ich) stdcall weg ist, 50:50 Chance ...

Zitat:

StringLists aus D5
Das kannst du glaube ich vergessen.
https://stackoverflow.com/questions/...elphi-versions
Notlösung wäre, den StringList.CommaString zu übergeben, also genau einen String.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.
Seite 1 von 2  1 2      

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