Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dll automatisch einbinden... (https://www.delphipraxis.net/111465-dll-automatisch-einbinden.html)

napstar 3. Apr 2008 20:57


dll automatisch einbinden...
 
hi ^^.. und schonwieder hab ich ein problem haha..

ich möchte plugins automatisch an meinem programm einbinden..
aus diesem tutorial habe ich gelernt, dass ich die dlls in einer unit in meinem programm laden muss.. nun können aber mehrere leute plugins für meinen programm schreiben und somit weiß ich nicht wie die plugins heißen und was die machen.

die plugins sind alle in einem unterordner gespeichert. diese sollen nun automatisch erkannt werden..

ich hoffe ihr habt mich verstanden.. da ich mich sehr schwer getahn hab das problem zu erleutern :P

SirThornberry 3. Apr 2008 21:00

Re: dll automatisch einbinden...
 
ist eigentlich ganz einfach. Einfach alle DLLs des Ordners auflisten. Das geht genau so wie das auflisten aller Dateien eines Ordners.
Diese Dateien kannst du dann dynamisch mit LoadLibrary laden und mit GetProcAddress kannst du schauen ob deine benötigten Funktionen drin sind.

napstar 3. Apr 2008 21:31

Re: dll automatisch einbinden...
 
hmmm hab mich mal bisschen erkundigt.. aber ich blick nicht so richtig durch..
kann mir mal jemand ein beispiel geben..?

napstar 3. Apr 2008 22:08

Re: dll automatisch einbinden...
 
ich glaube ich habs gleich.. doch meine versuche lassen sich nicht compilieren

Delphi-Quellcode:
unit readdll;

interface

uses windows;

type
  TSummenFunktion = function (Vlink: string) : string; stdcall;
  function decrypt(Vlink: string) : string;

implementation

function decrypt(Vlink: string) : string;
var SummenFunktion: TSummenFunktion;
    Handle: THandle;
begin
  Handle:=LoadLibrary(Form1.ListBox1.Selected);
  if Handle <> 0 then begin
    @SummenFunktion := GetProcAddress(Handle, 'decrypt');
    if @SummenFunktion <> nil then begin
      result := SummenFunktion(Vlink);
    end;
    FreeLibrary(Handle);
  end;
end;

end.
geht nicht. kommt folgender fehler
Zitat:

[Pascal Error] readdll.pas(17): E2003 Undeclared identifier: 'Form1'
[Pascal Error] readdll.pas(17): E2066 Missing operator or semicolon
[Pascal Error] readdll.pas(18): E2029 ';' expected but 'IF' found
[Pascal Error] readdll.pas(19): E2003 Undeclared identifier: 'SummenFunktion'
[Pascal Error] readdll.pas(19): E2064 Left side cannot be assigned to
[Pascal Error] readdll.pas(19): E2003 Undeclared identifier: 'Handle'
[Pascal Error] readdll.pas(21): E2003 Undeclared identifier: 'result'
[Pascal Error] readdll.pas(21): E2003 Undeclared identifier: 'Vlink'
[Pascal Error] readdll.pas(24): E2029 '.' expected but ';' found
[Pascal Warning] readdll.pas(25): W1011 Text after final 'END.' - ignored by compiler
[Pascal Fatal Error] main.pas(7): F2063 Could not compile used unit 'readdll.pas'
und wenn ich die Unit1 einbinde kommt ein anderer fehler..

Zitat:

[Pascal Fatal Error] main.pas(7): F2047 Circular unit reference to 'main'
main.pas ist das hauptformular

beide versuche haben nix gebracht..

Muetze1 3. Apr 2008 23:46

Re: dll automatisch einbinden...
 
Die Units können sich nicht gegenseitig einbinden, dann läuft der Compiler im Kreis. Trag einfach die Unit1 in die Uses Liste vom Implementation Teil der readdll unit ein.

Und grundsätzlich: Ich würde niemals fest auf die globale Form1 Variable zugreifen. Und selbst wenn es sich nicht vermeiden lässt, würde ich niemals irgendwelche Komponenten der Form direkt ansprechen bzw. auswerten. Die ListBox wäre tabu, es geht mich in einer anderen Unit nichts an, was da selektiert ist. Entweder ermittelt das die TForm1 selbst und fordert den Benutzer entsprechend auf eine Auswahl zu treffen, wenn keine besteht bzw. übergibt den selektierten Eintrag in einem Aufruf der anderen Unit. Und selbst wenn dies nicht gehen würde, dann würde ich eine Methode erstellen in TForm1 und die macht dieses und gibt den ausgewählten Eintrag zurück.

napstar 4. Apr 2008 10:10

Re: dll automatisch einbinden...
 
Zitat:

Zitat von Muetze1
Die Units können sich nicht gegenseitig einbinden, dann läuft der Compiler im Kreis. Trag einfach die Unit1 in die Uses Liste vom Implementation Teil der readdll unit ein.

Und grundsätzlich: Ich würde niemals fest auf die globale Form1 Variable zugreifen. Und selbst wenn es sich nicht vermeiden lässt, würde ich niemals irgendwelche Komponenten der Form direkt ansprechen bzw. auswerten. Die ListBox wäre tabu, es geht mich in einer anderen Unit nichts an, was da selektiert ist. Entweder ermittelt das die TForm1 selbst und fordert den Benutzer entsprechend auf eine Auswahl zu treffen, wenn keine besteht bzw. übergibt den selektierten Eintrag in einem Aufruf der anderen Unit. Und selbst wenn dies nicht gehen würde, dann würde ich eine Methode erstellen in TForm1 und die macht dieses und gibt den ausgewählten Eintrag zurück.

gut zu wissen.. aber da ich ja noch mit delphi ziemlich am anfang stehe, weiche ich zur einfachsten methode aus ^^.. aber wie sollte ich es denn deiner meinung nach machen.. irrgendwie muss ich doch an die daten rankommen..
und noch ne kleine frage: ich habe bemerkt, dass ich der listbox bei diesem befehl einen integer mitgeben muss.. ListBox1.Selected
dann würde ja ich ja selbst ein item markieren.. gibt es eine methode zu erkennen, welches item selektiert ist?

Muetze1 4. Apr 2008 17:56

Re: dll automatisch einbinden...
 
Zitat:

Zitat von napstar
aber wie sollte ich es denn deiner meinung nach machen.. irrgendwie muss ich doch an die daten rankommen..

Habe ich zuvor doch ausgeführt...

Zitat:

Zitat von napstar
und noch ne kleine frage: ich habe bemerkt, dass ich der listbox bei diesem befehl einen integer mitgeben muss.. ListBox1.Selected

In wie fern einen "Integer mitgeben"?

Ich kenne die Eigenschaft Selected nicht, ich kenne bei einer TListBox nur Delphi-Referenz durchsuchenItemIndex

Zitat:

Zitat von napstar
dann würde ja ich ja selbst ein item markieren.. gibt es eine methode zu erkennen, welches item selektiert ist?

Ob du das festlegst oder es nur ausliest hängt nur davon ab, ob du die Eigenschaft beschreibst oder nur liest.

EWeiss 4. Apr 2008 18:42

Re: dll automatisch einbinden...
 
Zitat:

Ich kenne die Eigenschaft Selected nicht, ich kenne bei einer TListBox nur
Er hat wohl einen quelltext von VB übersetzt ...
In Delphi gibts das nicht es sei denn es ist eine selbst erstellte Componente.

EDIT:

Nebenbei würde ich der DLL ein export zuweisen der in 'jeder' DLl vorhanden sein muss
Damit nicht plugins eingeladen werden welche den nicht unterstützen.

gruss Emil


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