Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.
Seite 2 von 3     12 3      

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