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
Mein Beileid
.
Die sauberte Lösung wäre (falls Du D5 noch verfügbar hast) für diese
DLL eine Wrapper-
Dll zu bauen, die wie eine Windows
API-
DLL alle exportierten Funktionen mit stdcall calling convention und
ausschließlich unter Verwendung von
API-kompatiblen Datentypen für Parameter und Rückgabewerte deklariert. Für Text wäre das PChar (= PAnsiChar in Tokyo).
Du hast da sonst schwerwiegende Kompatibilitätsprobleme:
- D5 und Tokyo verwenden unterschiedliche Memory manager, die von beiden Versionen verwendeten Sharemem-Versionen sind nicht kompatibel.
- Der D5 String-Typ ist nicht kompatibel mit dem Tokyo Ansistring-Typ, da sich das in-Memory Layout geändert hat