Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Funktion ausführen, Die in einem String steht? (https://www.delphipraxis.net/101216-funktion-ausfuehren-die-einem-string-steht.html)

p.abend 10. Okt 2007 05:54


Funktion ausführen, Die in einem String steht?
 
Hallo zusammen!

Ich habe einen Funktionsnamen in einem String stehen, wie z.B. "CheckMail". Jetzt möchte ich überprüfen ob eine Funktion CheckMail existiert, und wenn ja, möchte ich diese gerne aufrufen.

Geht das irgendwie auch ohne lauter IF, THEN und ELSE Anweisungen? Das Problem ist halt, das die Funktionen immer erweitert werden sollen und IF Anweisungen nicht viel Sinn machen.

Es wäre schön wenn mir jemand helfen könnte!

DelphiKlaus 10. Okt 2007 06:04

Re: Funktion ausführen, Die in einem String steht?
 
Hallo,

wenn Du die Funktionen in eine DLL auslagerst, kannst Du mit dem Funktionsnamen in einem String den Entrypoint bestimmen und die Funktion dann aufrufen. Guck mal nach GetProcAddress.

Klaus

p.abend 10. Okt 2007 06:55

Re: Funktion ausführen, Die in einem String steht?
 
Hallo DelphiKlaus!

Danke für deine Antwort. Ich habe mal danach gesucht, und auch etwas gefunden. http://www.delphi-forum.de/viewtopic...getprocaddress

Nun ist die Frage, wie ich das ganze anwende, denn ich weiß ja nicht welche Funktionen in der DLL drin sind. Oder muss ich zwingend Wissen welche Funktionen da drin stehen?

Oder kann ich das auch so machen?

Delphi-Quellcode:
type
   TMyFunc = function(): Boolean; stdcall;
{...} 

var
  {...} 
  DLLHandle: THandle;
  MyFunc: TMyFunc;
 
procedure TMainForm.ButtonLoadClick(Sender: TObject);
begin
  try
    DLLHandle := LoadLibrary(PChar('meine.dll'));
    @MyFunc := GetProcAddress(DLLHandle, 'mein funktions string');

    if (@MyFunc <> nil) then
    begin
      // ausführen MyFunc();
      {...} 
    end
    else begin
      FreeLibrary(DLLHandle);
      MessageDlg('Die Funktion wurde in der Bibliothek meine.dll nicht gefunden...' + #13 
        + 'Source: meine.dll', mtError, [mbOk], 0);
    end;
  except
    MessageDlg('Die Funktions-Bibliothek meine.dll konnte nicht geladen werden!' + #13 
      + 'Source: meine.dll', mtError, [mbOk], 0);
 end;

OldGrumpy 10. Okt 2007 07:09

Re: Funktion ausführen, Die in einem String steht?
 
Na man sollte halt schon die Parameterliste und den Rückgabewertetyp der Funktion kennen. Gibt sonst z.B. ganz fiese Abstürze wenn Programm und DLL sich nicht über die Anzahl Parameter auf dem Stack einig sind :)

Der Knackpunkt für Dich ist nämlich, dass man bei DLLs relativ einfach (bitte Anmerkung unten beachten) rausfinden kann, welche Funktionsnamen eine DLL exportiert, das gilt aber halt eben nicht für die Parameterlisten und Rückgabetypen. Anmerkung: Eine DLL muss auch nicht zwangsweise Klartextnamen exportieren, es gibt auch etliche DLLs bei denen nur Ordinals exportiert werden (da sind die Funktionen dann einfach durchnumeriert und werden mit einer Zahl statt einem Namen identifiziert).

Es hindert Dich ja aber auch niemand daran, so eine Art Inhaltsverzeichnis der DLL selber zu programmieren. D.h. es gibt dann eine feststehende Funktion die dir einen Datenblock an Informationen liefert, was in der DLL sonst noch drin ist.

Ob das ganze aber überhaupt sinnvoll ist, kann ich anhand der spärlichen Informationen nicht beurteilen. Was genau hast Du überhaupt vor? Die bisherigen Beschreibungen sind ja mehr als diffus... :)

p.abend 10. Okt 2007 07:14

Re: Funktion ausführen, Die in einem String steht?
 
Hallo nochmal!

Also ich will ein kleines Fernwartungs-Administrationstool entwickeln. Wenn jemand bei uns in der Familie Probleme mit dem Computer hat, dann bin ich der erste der angerufen wird.

Jetzt habe ich mir überlegt ein kleines Fernwartungstool zu programmieren. Das Tool holt sich beim Start immer die aktuellste dll aus dem Netz. Wenn ich mich dann auf den Computer verbinde und "Kommandos" sende, wie z.B. RESTART oder sowas, dann soll der Client die Funktion RESTART in der dll suchen und ausführen können.

Wie erstelle ich denn am besten so ein "Inhaltsverzeichnis" meiner Dll?

Ist mein Lösungsansatz überhaupt sinnvoll oder hast du eine andere Idee?

Phoenix 10. Okt 2007 07:22

Re: Funktion ausführen, Die in einem String steht?
 
Eventuell wäre Bei Google suchenPascalScript eine Alternative.
Damit kannst Du Deine Anwendung Scriptbar machen und solche Methoden aus dem Script heraus aufrufen.

p.abend 10. Okt 2007 07:39

Re: Funktion ausführen, Die in einem String steht?
 
Cool! Vielen Dank Phoenix. Was es nicht alles gibt.

Ich werde mich dann mal ans versuchen machen.

Danke nochmal an alle!

OldGrumpy 10. Okt 2007 11:15

Re: Funktion ausführen, Die in einem String steht?
 
Wenn ich "Fernwartungstool" höre, denke ich zuerst an UltraVNC. :) Recht einfach einzurichten und extrem hilfreich. :) Und ganz ohne Aufwand was eigenes zu schreiben usw.

DP-Maintenance 10. Okt 2007 12:29

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Geht um Delphi

DMW 10. Okt 2007 13:00

Re: Funktion ausführen, Die in einem String steht?
 
Zitat:

Zitat von p.abend
Ich habe einen Funktionsnamen in einem String stehen, wie z.B. "CheckMail". Jetzt möchte ich überprüfen ob eine Funktion CheckMail existiert, und wenn ja, möchte ich diese gerne aufrufen.

Geht das irgendwie auch ohne lauter IF, THEN und ELSE Anweisungen? Das Problem ist halt, das die Funktionen immer erweitert werden sollen und IF Anweisungen nicht viel Sinn machen.

Wenn du nicht eine Funktion, sondern eine Methode einer Delphi-Klasse verwendest, geht das, sofern die Methode als published deklariert ist.

Beispiel: http://c-plusplus.de/forum/viewtopic...1.html#1258421


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