Entwickler-Ecke

Sonstiges (Delphi) - String zu "Befehl" - Möglich?


MephistoFFF - Do 19.03.09 17:15
Titel: String zu "Befehl" - Möglich?
Hallo! Im PHP gibt es eine Möglichkeit, dass man einen String so behandelt, als wäre es Sourcecode.

Nun meine Frage: Ist dies auch im Delphi möglich? Also z.B.: ich habe ein Editfeld, und trage dort "showmessage('Hallo');" ein. Delphi soll diesen String nun z.B. nach klicken eines Buttons so behandeln, als wäre es Sourcecode, also dass jetzt im Bsp. die Message "Hallo" aufpoppt.
Ich brauche das ganze natürlich nicht, um messages anzuzeigen^^.

Bin für jede Hilfe dankbar.

mfG


FinnO - Do 19.03.09 17:33

geht afaik NICHT


LexXis - Do 19.03.09 17:37

Wenn schon müsstest du das über Scripting regeln. Entweder für grundelegende Sachen selbst einen Interpreter basteln, oder auf fertige professionele Lösungen zurückgreifen z. B. RemObjects Pascal Script [http://www.remobjects.com/ps.aspx]


Gewuerzgurke - Do 19.03.09 17:59

In PHP oder z.B. auch in JavaScript geht das, weil das Scriptsprachen sind. Pascal dagegen wird kompiliert und was dabei rauskommt, siehst du, wenn du eine EXE im Editor öffnest. Was möglicher weise funktionieren würde, währe, dass man ein Eingabefeld macht, in das man dann solchen kompilierten Code eingiebt. Würde aber irgendwie niemand etwas nützen :D


Yogu - Do 19.03.09 18:30

Irgendwer hat hier mal eine Funktion gepostet, die Assembler aufrufen kann. Aber da das, wie gesagt, nicht viele schreiben können, müsstest du dir einen Compiler schreiben, der aus dem eingegebenen Pascal-Skript einen Assemblercode erzeugt.


BenBE - Fr 20.03.09 12:39

Eval ist Evil! Sowohl in PHP als auch fast allen anderen Programmiersprachen (Einschließlich JavaScript).

Die meisten Makrosprachen sind da nicht viel besser. Der kürzeste XSS-Wurm in JavaScript sind ~100 Byte. Gut, das Formatieren einer Festplatte geht mit wesentlich weniger Code (wenn man die API nutzt), aber was man immer als Risiko solcher Script-Lösungen hat, ist, dass man Tür und Tor zum System öffnet, was sicherheitstechnisch eine Katastrophe ist.

Eval sollte das Letzte sein, an was man denkt, wenn es darum geht, Benutzerdefinierbare Aktionen auszuführen.


Gewuerzgurke - Fr 20.03.09 16:05

Wie kann man denn mit JavaScript die Festplatte formatieren?


mkinzler - Fr 20.03.09 16:12

user profile iconGewuerzgurke hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann man denn mit JavaScript die Festplatte formatieren?

Zum Glück geht das nicht.


BenBE - Fr 20.03.09 16:16

user profile iconmkinzler hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGewuerzgurke hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann man denn mit JavaScript die Festplatte formatieren?

Zum Glück geht das nicht.

IE, FileSystemObject, und mal wieder ein Exploit. Sicher, mit aktuellem SPs nicht, aber ging mal über Side Channels ;-)


mkinzler - Fr 20.03.09 16:18

Deshalb ist es auch wichtig das Microsoft mit JScript JavaScript um solche für Webscripting wichtigen Funktionen wie Formatieren erweitert hat.


Gewuerzgurke - Fr 20.03.09 16:31

Auch wenn dies nicht das Forum ist...
Ich kenne JavaScript von 'Websites' her und kenne keinen Befehl, des es erlaubt, eine Datei zu öffnen, zu löschen oder sonst was... Es könnte mit eval höchstens jemand einen Code einschleusen, der das Layout der Website bis zum Neuladen ruiniert - oder? :shock:


mkinzler - Fr 20.03.09 16:32

Microsoft hat JacaScript um soetwas erweitert, allerdings sollte das nur für lokale Seiten möglich sein. Es gab aber schon Lücken, die es möglich machten, dies auch auf remote Seiten zu nutzen


Gewuerzgurke - Fr 20.03.09 16:47

Ach Microsoft... Aber jetzt kommt im Internet Explorer immer so eine Leiste mit aktive Inhalte zulassen.


René R.Fo. - Do 09.04.09 10:28

Zu der Anfangsgestellten frage das geht doch!!!

If (Edit1.Text = 'Hallo') then {was du machen möchtest};


GTA-Place - Do 09.04.09 10:37

Das ist aber nicht das, was der Threadersteller möchte. Er will direkt den Source in das Edit-Feld eingeben und nicht prüfen, was da drin steht. Und wie sowas funktioniert habe ich hier mal geschrieben (Mathe-Ausdrücke ausrechnen):

http://www.delphi-forum.de/viewtopic.php?p=517001#517001


Gewuerzgurke - Do 10.09.09 14:26

Ich muss jetzt doch nochmal fragen:

Ich habe ein shortstring in dem dann z.B. steht 'Procedure1'. Dieser wird an eine Funktion übergeben, die dann eben Procedure1 aufruft. Ich wollte wissen, ob es in diesem Fall eine bessere Möglichkeit gibt als:


Delphi-Quelltext
1:
2:
3:
4:
if (shortstring = 'Procedure1'then Procedure1;
if (shortstring = 'Procedure2'then Procedure2;
if (shortstring = 'Procedure3'then Procedure3;
(...)


Ich dachte da an eine Art Pointer auf die entsprechenden procedure..n. Ich könnte leicht realisieren, dass statt 'Procedure1' ein Pointer, also z.B. 274751, übergeben wird und dann mit einer Art goto diese procedure aufgerufen wird...

Währe so etwas denkbar?


jaenicke - Do 10.09.09 14:28

Sicher ist das denkbar, aber mit Parametern wird es dann schwierig. ;-)


Gewuerzgurke - Do 10.09.09 14:43

Naja, sobald man eine Änderung am Programm vornimmt, würde sich der Pointer verändern, denke ich mal...
Aber in meinem Fall steht die "Ziel-procedure" in einer DLL. Normaler Weise müsste ich die dann einbinden, etwa so:


Delphi-Quelltext
1:
procedure Procedure1; external 'DieDll.dll';                    


Dadurch, dass in der DLL dann steht exports Procedure1; werden ja alle Informationen für den Aufruf bereitgestellt, also der Name der Procedure, die Adresse und eine Möglichkeit, die Variablen zu übergeben. Währe es dadurch möglich, diese Procedure aufzurufen, ohne dass ich diese erst in meinem Programm deklarieren muss?


Boldar - Do 10.09.09 14:51

mach doch einfach dynamische importe, und importier die funktionen erst beim aufruf.
Ist zwar nicht performant, aber die einfachste Lösung.


Gewuerzgurke - Do 10.09.09 15:08

Nach so etwas suche ich auch... Hat jemand gerade etwas Quellcode für mich?


Boldar - Do 10.09.09 15:43

klick [http://www.lmgtfy.com/?q=dll+dynamisch+laden+delphi]


Gewuerzgurke - Do 10.09.09 16:58

Hihi, der Link ist echt klasse!

Ich hatte es mit mäßigem Erfolg hier im Forum versucht...


delphi10 - Fr 11.09.09 17:59

user profile iconMephistoFFF hat folgendes geschrieben Zum zitierten Posting springen:
Hallo! Im PHP gibt es eine Möglichkeit, dass man einen String so behandelt, als wäre es Sourcecode.

Nun meine Frage: Ist dies auch im Delphi möglich? Also z.B.: ich habe ein Editfeld, und trage dort "showmessage('Hallo');" ein. Delphi soll diesen String nun z.B. nach klicken eines Buttons so behandeln, als wäre es Sourcecode, also dass jetzt im Bsp. die Message "Hallo" aufpoppt.
Ich brauche das ganze natürlich nicht, um messages anzuzeigen^^.

Bin für jede Hilfe dankbar.

mfG


Also gehen tuts schon, aber mit ein wenig Aufwand. Ich hatte einen Parser entwickelt, der die Stringeingaben zu Token wandelte und quasi die Ausführung simulierte. Vorteil bei der Sache war, dass meine User sich jederzeit einen eigenen Vorrat an Befehlen zulegen konnten. Es gab eine öffentliche Tokenliste, in die jeder freie Plätze mit Token und Anweisungen/Parameter belegen konnte. Letztlich interpretierte der Parser fast einen Satz in Umgangssprache mit eingeschränktem (mehr themenbezogenem) Wortschatz. Leider habe ich diesen Parser so in das in das Hauptprogramm verzahnt, dass eine eigenständige Unit kaum man noch herausdestilliert werden könnte. War aber eine schöne Übung, wollte einfach wissen, ob ich es hinkriege.
Gruß Delphi10


alzaimar - Fr 11.09.09 20:53

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
... Leider habe ich diesen Parser so in das in das Hauptprogramm verzahnt, dass eine eigenständige Unit kaum man noch herausdestilliert werden könnte...

Neulich habe ich aus Spass einen Compiler geschrieben, den ich per USB und Klingeldraht direkt an meine Schläfenlappen gekoppelt habe. Dadurch konnte ich mir das Tippen sparen und habe mir einfach ein Problem ausgedacht: Schwupps, war die EXE zur Problemlösung fertig. Letztendlich war mir das aber zu langweilig, also habe den Prototypen wieder eingestampft und aus dem Klingeldraht lieber dufte Zahnstocher gebaut. War ne lustige Übung. Schade, das ich den Quellcode entsorgt habe, denn den brauchte ich ja ursprünglich nicht mehr. :lol:


Yogu - Fr 11.09.09 21:47

user profile iconalzaimar, hier fehlt eine Funktion zum bookmarken eines Posts :rofl:


Xentar - Fr 11.09.09 21:57

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar, hier fehlt eine Funktion zum bookmarken eines Posts :rofl:

Äh, nein ;)
Neben dem "Verfasst am:" gibt es nen kleines unschuldiges Symbol, hinter dem sich ein Link auf diesen bestimmten Post verbirgt - den kannst du dir gerne bookmarken :D

Aber die Story find ich auch echt cool :D


Yogu - Fr 11.09.09 22:30

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar, hier fehlt eine Funktion zum bookmarken eines Posts :rofl:

Äh, nein ;)
Neben dem "Verfasst am:" gibt es nen kleines unschuldiges Symbol, hinter dem sich ein Link auf diesen bestimmten Post verbirgt - den kannst du dir gerne bookmarken :D

Ich meinte eher so etwas wie ein gobales Archiv in der Entwicker-Ecke für immer wieder lustige und themenbezogene Beiträge :mrgreen:

Aber dieser Beitrag ist schon nicht mehr ganz so themenbezogen... also Schluss mit dem Off-Topic


delphi10 - Fr 11.09.09 22:55

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
... Leider habe ich diesen Parser so in das in das Hauptprogramm verzahnt, dass eine eigenständige Unit kaum man noch herausdestilliert werden könnte...

Neulich habe ich aus Spass einen Compiler geschrieben, den ich per USB und Klingeldraht direkt an meine Schläfenlappen gekoppelt habe. Dadurch konnte ich mir das Tippen sparen und habe mir einfach ein Problem ausgedacht: Schwupps, war die EXE zur Problemlösung fertig. Letztendlich war mir das aber zu langweilig, also habe den Prototypen wieder eingestampft und aus dem Klingeldraht lieber dufte Zahnstocher gebaut. War ne lustige Übung. Schade, das ich den Quellcode entsorgt habe, denn den brauchte ich ja ursprünglich nicht mehr. :lol:


Kann es sein, dass du irgend etwas falsch oder überhaupt nicht verstanden hast? Möglicherweise tritt aber hier wieder der Effekt auf, über alles zu lachen, was man nicht versteht, oder noch wahrscheinlicher ist die Einstellung "was ich nicht kann, kann auch kein anderer".
Letztlich kann ich aber dem user profile iconMephistoFFF die entsprechenden Passagen aus dem Hauptprogramm verfügbar machen, eine Unit wird er sich dann selber basteln müssen. Du kannst dann ja helfend eingreifen, wäre ja mal eine wohltuende Abwechslung zu kindischem Geschwafel.
Ah ja, noch etwas user profile iconalzaimar, tu mir einen Gefallen - ignoriere mich noch nicht einmal.

Für alle anderen lesender User hier sei gesagt, dass ich meinen Post einfach so runtergeschrieben habe ohne mir groß Gedanken über eine eventuelle Fehlinterpretation gemacht zu haben - das Programm ist genau so entstanden, wie ich es beschrieben hatte.
Ich habe es unter erhebliche Zeitdruck mit meinen Team (4MA) entwickelt. Es enthält ca. 200.000 Zeilen, davon entfallen auf den Parser/Tokenizer und Interpreter etwa 14.000 Zeilen+Assembler. Aber vielleicht habe ich user profile iconMephistoFFF einen kleinen Stubs in die richtige Richtung gegeben. Ich kann mir vorstellen, dass er auf deinen Klingeldraht verzichten möchte.

user profile iconYogu, sorry, habe ich erst hinterher gelesen.


delphi10 - Fr 11.09.09 23:32

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMephistoFFF hat folgendes geschrieben Zum zitierten Posting springen:
Hallo! Im PHP gibt es eine Möglichkeit, dass man einen String so behandelt, als wäre es Sourcecode.

Nun meine Frage: Ist dies auch im Delphi möglich? Also z.B.: ich habe ein Editfeld, und trage dort "showmessage('Hallo');" ein. Delphi soll diesen String nun z.B. nach klicken eines Buttons so behandeln, als wäre es Sourcecode, also dass jetzt im Bsp. die Message "Hallo" aufpoppt.
Ich brauche das ganze natürlich nicht, um messages anzuzeigen^^.

Bin für jede Hilfe dankbar.

mfG


Also gehen tuts schon, aber mit ein wenig Aufwand. Ich hatte einen Parser entwickelt, der die Stringeingaben zu Token wandelte und quasi die Ausführung simulierte. Vorteil bei der Sache war, dass meine User sich jederzeit einen eigenen Vorrat an Befehlen zulegen konnten. Es gab eine öffentliche Tokenliste, in die jeder freie Plätze mit Token und Anweisungen/Parameter belegen konnte. Letztlich interpretierte der Parser fast einen Satz in Umgangssprache mit eingeschränktem (mehr themenbezogenem) Wortschatz. Leider habe ich diesen Parser so in das in das Hauptprogramm verzahnt, dass eine eigenständige Unit kaum man noch herausdestilliert werden könnte. War aber eine schöne Übung, wollte einfach wissen, ob ich es hinkriege.
Gruß Delphi10


Grummel, das sollte eigentlich in das erste Posting.
Edit: Typische Befehlszeilen lasen sich etwa so:
OEFFNE ORNER XYZ UND LADE DATEI ABC.DOC
ERZEUGE EIN PDF UND SENDE AN eMAIL@ADRESSE
WENN VERSAND OK DANN MELDUNG1
WENN VERSAND NICHT OK DANN MELDUNG2
Es gab einen Wortschatz von jeweils 100 - 150 KeyWords zu verschiedenen Aufgabengebieten. Daraus konnte jeder User seine Sequenzen zusammenbauen und als Script ablaufen lassen. Mal etwas vereinfacht dargestellt.


HelgeLange - Sa 12.09.09 01:45

Zurück zu der Frage mit dem Funcktionsnamen und der DLL...

Wenn man eine DLL dynamisch lädt, dann sieht das ja ungefähr so aus :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Handle := LoadLibrary('MeineDLL.dll');
If Handle <> 0 Then begin
  @AProcAddr := GetProcAddress(Handle, 'Procedure1'); 
  If Assigned(APRocAdress) Then
    AProcAddr;
  FreeLibrary(Handle);
end;


Technisch gesehen kannst Du den 2. parameter bei GetProcAdress ja als PChar-Variable mit dem übergeben, was Du gerade aufrufen willst.. Musst die proceduren ja einfach nur entsprechend mit diesen Namen in der DLL exportieren.