AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zeiger auf Stringerstellungsfunktion gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

Zeiger auf Stringerstellungsfunktion gesucht

Ein Thema von himitsu · begonnen am 17. Sep 2023 · letzter Beitrag vom 18. Sep 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Zeiger auf Stringerstellungsfunktion gesucht

  Alt 17. Sep 2023, 13:04
Delphi-Version: 11 Alexandria
Moin Moin,

ein
Delphi-Quellcode:
ZeigerVariable := GewünschteFunktion;
ZeigerVariable := @GewünschteFunktion;
funtioniert ja bei der Compilermagic der System.pas nicht,
aber wenn man den "eigentlichen" Namen kennt (wobei er gern in Pascal und Assembler unterschiedlich heißt), dann geht es oftmals doch,
nur hier beiße ich mir grade die Zähne aus.

Ach ja, es reicht, wenn es für Win32 funktioniert (64 Bit ist leider sowieso nicht möglich, dort wofür Dieses hier verwendet wird)
Drum kann ich hier auch Inline-Assembler nutzen.
Delphi-Quellcode:
procedure TForm4.FormCreate(Sender: TObject);
type
  TSetString = procedure(var S: AnsiString; Buffer: PAnsiChar; CharCount: Integer);
  TFromPChar = procedure(var Dest: AnsiString; Source: PAnsiChar; Length: Integer; CodePage: Word);
var
  FSetString: TSetString;
  FFromPChar: TFromPChar;
begin
  FSetString := System.SetString; // geht Beides nicht
  FSetString := @System.SetString; //
  asm
    mov FSetString, System.SetString // geht, aber ist das System.SetString mit ShortString, anstatt AnsiString
  end;

  // SetString mit AnsiString geht eigentlich auf System._LStrFromPCharLen
  FFromPChar := LStrFromPCharLen; // geht alles nicht
  FFromPChar := _LStrFromPCharLen; //
  FFromPChar := @_LStrFromPCharLen; //
  asm
    mov EAX, _LStrFromPCharLen // im Assembler kann man oft auf Funktionen der System.pas zugreifen
    mov EAX, LStrFromPCharLen // aber oft unter einem anderen Namen, nur finde ich Diesen nicht
    mov EAX, @LStrFromPCharLen //
    mov EAX, @_LStrFromPCharLen
    mov EAX, @@_LStrFromPCharLen
    mov FFromPChar, EAX
  end;

  var A: AnsiString;
  SetString(A, PAnsiChar(''), 0); // Nachfolgendes macht der Compieler aus dieser Zeile
  // push $00
  // mov edx,$01106400
  // lea eax,[ebp-$08]
  // xor ecx,ecx
  // call $00f3a5a8 // leider steht hier nur ein Zeiger und nicht der Name, aber landet dann bei System._LStrFromPCharLen
end;

Ja, für den Anfang verwende ich erstmal eine Wrapperfunktion ala
Delphi-Quellcode:
//procedure MySetString(var Dest: AnsiString; Source: PAnsiChar; CharCount: Integer);
procedure MyLStrFromPCharLen(var Dest: AnsiString; Source: PAnsiChar; CharCount: Integer; CodePage: Word{=CP_ACP});
begin
  SetString(Dest, Source, CharCount);
end;
und gebe davon den Zeiger weiter.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Zeiger auf Stringerstellungsfunktion gesucht

  Alt 18. Sep 2023, 22:20
Auf die internen Funktionen kannst Du per asm zugreifen (beachte den Namespace, 5 falsche hast Du schon probiert! Zudem bitte kein MOV sondern LEA verwenden. Es sei denn Du willst gar keine Addresse ermitteln, sondern die dort stehenden Daten).
Delphi-Quellcode:
var
  OldProcAddress : Pointer;
begin
  OldProcAddress := 0;
  asm
    LEA EAX, System.@LStrFromPCharLen
    MOV OldProcAddress, EAX
  end;
  // Bei mir steht dann z.b. $3DA208 drin
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union (18. Sep 2023 um 22:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Zeiger auf Stringerstellungsfunktion gesucht

  Alt 18. Sep 2023, 23:09
Danke.
Ich wusste doch, irgendwie so ging es. (doch noch nicht "ganz" vergesslich)


LoadIrgendwasAddress


Nja, zumindestens hätte es erstmal auch mit MOV kompilieren müssen, mit dem "richtigen" Namen
und dann wäre hoffentlich aufgefallen, dass der Wert nicht ganz stimmt.

Mit System. hatte ich auch schon paar Versuche, aber das @ davor ... jaaaaa, beinah vergessen, dass es zum Namen gehört.





So, dann noch die TStream durch TBytes ersetzen. (vorher nochmal gucken, ob dynamische Arrays wirklich immernoch intern gleich sind)

Die mit TVarRec bzw. array-of-const auch einen Wrapper drumrum, der auf Typ 17 aka vtUnicodeString prüft und es nach AnsiString konvertiert (WideString wäre nutzlos, da im DEC bestimmt eh zu AnsiString wird)

Variant ist egal, da nur intern genutzt, aber nicht in den Schnittstellen.

Dann sollte das Wichtigste erstmal wieder laufen.
https://www.delphipraxis.net/213736-...-fuer-neu.html
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Zeiger auf Stringerstellungsfunktion gesucht

  Alt 18. Sep 2023, 23:11
Das alles hört sich gruselig an
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Zeiger auf Stringerstellungsfunktion gesucht

  Alt 18. Sep 2023, 23:18
Könnte schlimmer sein ... die meisten der hunderten Methoden machen keine Probleme.

Hier geht es darum, die Strings, welche aus dem DEC rauskommen, ins neue DelphiString-Format zu konvertieren.
* jetzt mach ich das noch in der DLL.
* mir fällt grade ein, dass es auch in der EXE ginge, aber dann müsste ich den String sowieso wieder in die DLL geben, um ihn dort freizugeben, und ich müsste noch genauer aufpassen, dass das neue Delphi nicht versucht auf die Verwaltungsdaten des "alten" AnsiString zuzugreifen (CodePage und CharSize gab es dort noch nicht)



Am Schönsten wäre es, selbst wenn der Code immernoch nicht öffentlich wird, statt der .DCU an ein paar .OBJ zu kommen. (nur ein kleiner Klick in den Projektopionen und dann neu kompilieren)
Dann ließe es sich direkt in die EXE linken (ala ZLib und RegEx) ... abgesehn vom UnicodeString sollte sich aber der Rest nahtlos ins neue Delphi einfügen, inkl. dem neuen Inneren der AnsiStrings,
da ja dann der alte Code die neuen Funktionen der System-Unit nutzen müsste.



Delphi 7 ist manchmal schon ein Krampf
(viele Jahre nichts mehr damit gemacht)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Sep 2023 um 23:24 Uhr)
  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 08:24 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