Vielen Dank für den Hinweis mit SimpleShareMem, das vereinfacht ja letztendlich ... Alles!
Natürlich direkt beim ersten Start den Laufzeitfehler bekommen "The memory manager cannot be changed after it has been used." *obwohl* ich das alte ShareMem etc. nirgendwo mehr aufrufe. Bevor ich jetzt bei jedem kleinen Demo-Projekt wieder akribisch drauf achten muss, SimpleShareMem als allerallerallererste
Unit des Projektes einzubinden, verwende ich lieber direkt die späte Bindung.
Da ich dem Wahrscheinlichkeits-Papagei nicht zu 100% traue, würdest du bitte einen kurzen Blick auf den überarbeiteten Code werfen? Ist der in dieser Form "sicher" im Sinne von gut programmiert und keine zu erwartenden Exceptions und Fehlverhalten wegen irgendwelchen Speicherproblemen?
(Den Inhalt von function MyStrReverse(const S: String): String; einfach komplett ignorieren, ist ja nur ein Dummy. Danke!)
Delphi-Quellcode:
unit uHauptprogramm;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ExtCtrls, System.SimpleShareMem;
type
TForm1 =
class(TForm)
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
TReverseString =
procedure(
const input: widestring;
var output: widestring;
var success: Boolean);
stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
inputStr, reversedStr: widestring;
success: Boolean;
hDLL: THandle;
DynReverseString: TReverseString;
begin
try
hDLL := LoadLibrary('
pDLL.dll');
if hDLL = 0
then
raise Exception.Create('
Konnte pDLL.dll nicht laden!');
try
@DynReverseString := GetProcAddress(hDLL, '
ReverseString');
if not Assigned(DynReverseString)
then
raise Exception.Create('
Konnte die Funktion "ReverseString" nicht finden!');
inputStr := LabeledEdit1.Text;
reversedStr := '
';
DynReverseString(inputStr, reversedStr, success);
if success
then
begin
LabeledEdit2.Text := reversedStr;
end;
finally
FreeLibrary(hDLL);
end;
except
on E:
Exception do
begin
ShowMessage(E.ClassName + '
: ' + E.
Message);
end;
end;
end;
end.
Delphi-Quellcode:
library pDLL;
uses
System.SimpleShareMem;
{$R *.res}
function MyStrReverse(
const S: widestring): widestring;
var
P1, P2: PWideChar;
Temp: WideChar;
Len: Integer;
begin
Len := Length(S);
SetLength(Result, Len);
P1 := PWideChar(S);
P2 := @Result[Len];
while Len > 0
do
begin
Temp := P1^;
P1^ := P2^;
P2^ := Temp;
Inc(P1);
Dec(P2);
Dec(Len);
end;
end;
procedure ReverseString(
const input: widestring;
var output: widestring;
var success: Boolean);
stdcall;
export;
begin
success := False;
try
output := MyStrReverse(input);
success := True;
except
// Hier könnte ein Fehlerprotokoll hinzugefügt werden
end;
end;
exports
ReverseString;
begin
end.
Dank dir!
Edit: Überall "widestring" eingestetzt. Da string ja von widestring erbt, sollte das theoretisch unerheblich gewesen sein...
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit