AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

String mit .dll ohne borlndmm.dll

Ein Thema von berens · begonnen am 31. Okt 2023 · letzter Beitrag vom 31. Okt 2023
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: String mit .dll ohne borlndmm.dll

  Alt 31. Okt 2023, 15:29
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

Geändert von berens (31. Okt 2023 um 15:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: String mit .dll ohne borlndmm.dll

  Alt 31. Okt 2023, 16:05
Da string ja von widestring erbt
Nein, tut es nicht.

String, also AnsiString (inkl. dessen Nachfahren ala UTF8String oder RawByteString) und UnicodeString sind LongStrings.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: String mit .dll ohne borlndmm.dll

  Alt 31. Okt 2023, 16:23
Upsi, das longint was von integer erbt, nicht widestring von string
Danke für die Korrektur.

Aber ansonsten passt der Rest, oder?
Innerhalb der jeweiligen Prozeduren sollte es ja im Rahmen dessen, was ich benötige, keine Probleme geben, wenn ich z.B. übergebene Strings über impliziten oder expliziten Typcast in widestring umwandle/zwischenspeichere und später wieder zurück?
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat
Antwort Antwort

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 20:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz