Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Externen Programmcode ausführen? (https://www.delphipraxis.net/40248-externen-programmcode-ausfuehren.html)

Master_RC 13. Feb 2005 00:28


Externen Programmcode ausführen?
 
hi leutz!

eine frage, die ich zwar schon seit langem gelöst haben möchte, sie mir aber erst gerade wieder eingefalln ist :)


also...

wie kann ich es machen, dass z.b. eine textdatei geladen wird, diese dann eingelesen und dann als programmcode ausgeführt wird... mmhmmm...

wüsste jetzt leider kein beispiel...


naja...
könnte mir jemand, sagen, wie ich das mache (außer mit DLLs!) und kann mir jemand evtl. gleich ein beispiel liefern (löst dann gleich mehrere fragen ;) )


THX! im Voraus!


PS:
wegen den DLLs...
*ich check die einfach nicht* :(
(kann mir ja mal jemand am rande erklären ;) )

Dax 13. Feb 2005 00:32

Re: Externen Programmcode ausführen?
 
Wie meinst du das? Wenn du Code meinst, wie du ihn in Delphi schreibst (und davon gehe ich aus), wirst du einen Interpreter brauchen. Bei der JVCL ist ein recht guter dabei, schau ihn dir mal an. ;)

Wenn du nun dein Script in dem Speicher kompilieren willst, damit es wie "echter" Delphi-Code ausgeführt wird, brauchst du noch einen Runtime-Assembler (daran arbeite ich grade zufällig :angle2:).

Hansa 13. Feb 2005 00:36

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von Master_RC
...wie kann ich es machen, dass z.b. eine textdatei geladen wird, diese dann eingelesen und dann als programmcode ausgeführt wird... mmhmmm...

Du willst z.B. folgende Textdatei ausführen :

Delphi-Quellcode:
Muh
kuh
milka
extern
...
Welches Programm soll das verstehen ???? Oder was willst du ??

Master_RC 13. Feb 2005 00:42

Re: Externen Programmcode ausführen?
 
na delphi :roll:


also...
die txt-datei beinhaltet z.b.:

procedure form1.create........
.........
.........
........


und das soll eben dann ausgeführt werden ...

flomei 13. Feb 2005 00:45

Re: Externen Programmcode ausführen?
 
Ich denke Dax hat da weiter oben schon gesagt was du dazu benötigst...

MFG Florian :hi:

c113plpbr 13. Feb 2005 00:51

Re: Externen Programmcode ausführen?
 
Schau dir mal PascalScript an, das gibts auf http://www.remobjects.com/ kostenlos mit Soße zum Download.
PascalScript ist eine Script-Engine, mit der Pascal-Scripts problemlos übersetzt werden, und in deinen Code zur Laufzeit eingebunden werden können. Diese Skriptsprache ähnelt Delphi sehr (is ja auch Pascal ;) ), allerdings gibt es kleine unterschiede ...

ciao, Philipp

Hansa 13. Feb 2005 00:54

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von flomei
Ich denke Dax hat da weiter oben schon gesagt was du dazu benötigst...

Aha, tatsächlich einen "Runtime-Assembler" :lol:

flomei 13. Feb 2005 02:16

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von flomei
Ich denke Dax hat da weiter oben schon gesagt was du dazu benötigst...

Aha, tatsächlich einen "Runtime-Assembler" :lol:

Um es mit den Worten meines Fahrlehrers zu sagen:
Zitat:

Ich hab doch keine Ahnung von dem Sch**** hier...
DAX meint wohl das Richtige auch wenn seine Bezeichnung dafür falsch ist. Ist doch letztendlich egal, solange der Hilfesuchende weiss wer Ahnung hat... ;)

MFG Florian :hi:

Master_RC 13. Feb 2005 11:46

Re: Externen Programmcode ausführen?
 
gut...
dann werd ich mir mal so nen assembler suchen... auch wenn ich keine ahnung von dem scheiss hab ;)


naja...
kann mir evtl. noch jemand erklären, wie DLLs funktionieren?
ich hab mir schon etliche tutos runtergeladen, kapiers abba einfach nicht... das geht doch gar net! ;)

atreju2oo0 13. Feb 2005 12:46

Re: Externen Programmcode ausführen?
 
Ich glaube kam das es jemand schafft DLL's mal so am Rande zu erklären...
Da hilft nur noch mehr Tutorials runterladen und lesen, lesen, lesen... :zwinker:

Master_RC 13. Feb 2005 13:03

Re: Externen Programmcode ausführen?
 
oh...
meine tutos waren immer nur so... naja... am rande erklärt eben :D

kann mir jemand evtl. nen link zu nem richtigen tuto posten?

Neutral General 13. Feb 2005 13:16

Re: Externen Programmcode ausführen?
 
Ich glaube du brauchst einfach das :


Buttton1.txt :

Delphi-Quellcode:
Button1.Caption := 'Hallo';
In Delphi :

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender : TObject);
begin
  {$Include Button1.txt} 
end;
Ist das gleiche wie

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender : TObject);
begin
  Button1.Caption := 'Hallo'; // Die Zeile kommt eben aus der Button.txt
end;

c113plpbr 13. Feb 2005 13:52

Re: Externen Programmcode ausführen?
 
@Neutral General: Das problem bei deiner Methode ist, dass durch die zeile {$Include Button1.txt} die entsprechende Datei beim Kompilieren mit eingebunden wird, und somit fest im Quellcode steht. D.h. die Datei wird im kompilierten Programm nichtmehr benötigt, da sie fest eingebunden wurde, also haben änderungen in deren Code auch nach dem kompilieren auch keine Wirkung mehr.

So wie ich Master_RC aber verstanden habe, soll die Datei zur Laufzeit des Programmes eingebunden werden, und nicht vorher. Daher empfehle ich für diese Aufgabe, wie schon gesagt PascalScript.

ciao, Philipp

mael 13. Feb 2005 14:55

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von Master_RC
kann mir evtl. noch jemand erklären, wie DLLs funktionieren?
ich hab mir schon etliche tutos runtergeladen, kapiers abba einfach nicht... das geht doch gar net! ;)

Also, eine DLL ist eine Sammlung von Funtionen/Prozeduren die man susätzlich zur EXE laden kann.
Entweder direkt beim Programmstart oder zur Laufzeit.
Z.B. ist es möglich per DLLs Plugins zu realisieren indem jede DLL die gleichen Funktionen bereitstellt (=exportiert).

Eine sehr einfache DLL für einen Musikplayer könnte so aussehen:

Delphi-Quellcode:
library WAVPlayer;

uses
  SysUtils, MMSystem;

{$R *.res}


function Play(FileName: PChar): Boolean; stdcall;
begin
  PlaySound(FileName, 0, SND_FILENAME);
end;


exports
  Play;

end.
Für MP3 müßte man die Implementierung der Play-Funktion natürlich entsprechend ändern.
Der Sinn hier DLLs zu verwenden ist, daß man das fertig Programm nachträglich erweitern kann.
Dazu muß aber die Schnittstelle gleich bleiben, also Play-Funktion muß immer vorhanden sein und die Parameter müssen gleich bleiben.

stdcall ist häufig sinnvoll da praktisch jede Programmiersprache diese Aufrufart unterstüzt. Sie ist auch die Standardaufrufsmethode für die Windows-API.

DLLs funktionieren aber nicht gut wenn man Objekte "exportieren" möchte. Innerhalb einer DLL geht das aber falls z.B. wie bei Formen man auf das Application-Objekt zugreifen muß ist dies sehr schwierig. Deswegen gibt es Packages (BPLs). Die kümmern sich um die Verwaltung die bei Objekten anfällt sind aber dafür aber nur mit Delphi nutzbar und auch von der Delphi-Version abhängig.

Hoffe das hilft etwas, Maël.

Master_RC 13. Feb 2005 18:58

Re: Externen Programmcode ausführen?
 
kewl, danke! :thumb:


wie ist das dann, wenn ich eine funktion ersetzen, bzw. erweitern will, also...

kann ich z.b. die function doof() ersetzen/überschreiben/erweitern, wenn ich in der DLL auch eine function doof() reinbau, oder meckern delphi dann?

und dann noch eine der (hoffentlich) letzten fragen:
wie bau ich die DLLs dann ein?
also... mit
{INCLUDE doof.dll} wird sie ja komplett zur entwurfszeit mit eingebunden, abba ich brauch die ja zur laufzeit...

Oxmyx 13. Feb 2005 19:33

Re: Externen Programmcode ausführen?
 
Eine DLL lädt man entweder statisch:
Delphi-Quellcode:
prcecure Play(); stdcall; external 'WAVPlayer.dll';
Oder dynamisch mit LoadLibrary. Danach muss man allerdings noch die Adresse der Funktion herausfinden mit GetProcAddress.

Master_RC 16. Feb 2005 12:44

Re: Externen Programmcode ausführen?
 
wie ist das jetzt, wenn ich ne globale variable in der dll benutz?

kann ich die dann auch im hauptprogramm nutzen?

Meflin 16. Feb 2005 15:06

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von Master_RC
wie ist das jetzt, wenn ich ne globale variable in der dll benutz?

kann ich die dann auch im hauptprogramm nutzen?

natürlich. du musst nur eine funktion in der dll haben, die als ergebnis den wer der variable liefert. dann rufst du in deinem programm diese funktion auf und hast diese variable in deinem programm und kannst sie einer globalen variable deines programmes zuweisen (also genauergesagt den wert).


Beckman 16. Feb 2005 15:15

Re: Externen Programmcode ausführen?
 
da hab ichs damals gelernt, als ich mein erstes plugin support brauchte :P

lies mal durch, falls du die info von 'Oxmyx' mit loadlibrary() und findprocaddress() nicht sofort umzusetzen weisst.

http://www.dsdt.info/tutorials/dlls/?page=1



lg, beck

Sprint 16. Feb 2005 15:22

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von Meflin
natürlich. du musst nur eine funktion in der dll haben, die als ergebnis den wer der variable liefert. dann rufst du in deinem programm diese funktion auf und hast diese variable in deinem programm und kannst sie einer globalen variable deines programmes zuweisen (also genauergesagt den wert).

Delphi bietet auch noch was anderes. Ich habe den Sinn zwar nie kapiert, aber die haben sich dabei bestimmt etwas gedacht.
Delphi-Quellcode:
library MyLib;

var
  ValueA: Integer;

  { ... }

exports
  ValueA;

begin
end.
Und dann im Hauptprogramm:
Delphi-Quellcode:
var
  ValueA: PInteger;
Delphi-Quellcode:
  ValueA := GetProcAddress(ModuleHandle, 'ValueA');
Delphi-Quellcode:
  ValueA^ := 10; // einen Wert setzen

Master_RC 16. Feb 2005 16:20

Re: Externen Programmcode ausführen?
 
mmmh.... das kapier ich auch net...
dann hab ich also in beiden fällen eine glb variable?
naja, ich werds dann einfach über ne funktion machen ;)

naja...
eigentlich wäre dieses thema dann erledigt, falls mir nicht noch was einfällt oder ein anderer senf verlieren will :)

Igotcha 16. Feb 2005 16:46

Re: Externen Programmcode ausführen?
 
Zitat:

Zitat von Master_RC
naja...
eigentlich wäre dieses thema dann erledigt, falls mir nicht noch was einfällt oder ein anderer senf verlieren will :)

Ok, ein bisschen Senf von mir ;-)

Ich arbeite gerade mit dynamischen BPLs und da habe ich das gleiche Problem gehabt.

Gelöst habe ich das dadurch, dass ich dem Aufruf der BPL ein TBPLIN-Object mitgebe und der Aufruf liefert dem Hauptprogramm ein TBPLOUT-Objekt mit.

Delphi-Quellcode:
Im Hauptprogramm:

myBPLOUT:=Execute(myBPLIN); // ruft dynamisch eine BPL-Datei auf
So kann ich die BPL einmal vom Hauptprogramm initialisieren (z.B. Datenbankconnection), mit dem TBPLOUT-Objekt kann ich in der BPL rumpspielen und die Werte stehen dem Hauptprogramm ebenfalls zur Verfügung.

Gruß Igotcha

Master_RC 18. Feb 2005 14:25

Re: Externen Programmcode ausführen?
 
@igotcha: also kann ich dann so z.b. DLLs einbinden... danke, werds mal versuchen :)

naja, eigentlich hab ichs ja bis jetzt...
ich hab noch eine frage, nur die fällt mir net ein...
naja, ich werd nochmal überlegen :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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