Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL als Erweiterung für mein Programm (https://www.delphipraxis.net/26583-dll-als-erweiterung-fuer-mein-programm.html)

F.W. 25. Jul 2004 22:28


DLL als Erweiterung für mein Programm
 
Hallo wiedermal! (Ich weiß nicht, wo ich den Thread hinschreiben soll, ich hoffe HIER ist richtig)

Ich hab mir heute mal die Benutzung von DLLs reingezogen. Nun ist es ja so, dass das Programm, welches irgendwelche Funktionen aus DLLs nimmt, Nicht starten kann, wenn es die DLL nicht findet.

Ich würds aber gern so machen, dass wenn die DLL 'xyz.dll' im Verzeichnis liegt, dann soll ein zusätzlicher Button angezeigt werden, mit dem man dann das Formular aus der DLL aufrufen kann, oder irgendeine andere Zusatzfunktion, quasi a Plugin?!

Bsp:
Ich hab ein Programm, mit dem man Werte errechnen kann und wer besonders nett fragt, bekommt die Zusatzfunktion (die DLL) und kann sich mit der DLL ein Diagramm von den Werten anzeigen lassen (was die DLL beinhalten würde).

Aber wenn das Prog schon VOR dem starten streikt, weil die DLL nicht da ist, die's evtl. benutzen soll, könnt ich das schlecht als Zusatzfunktion einbauen.

Bei Counter-Strike ist es ja auch so, man kann sich verschiedene Mods holen, die DLLs von denen einbinden und schon hat man schöne Zusatzfunktionen!

Danke schonmal!

supermuckl 25. Jul 2004 22:33

Re: DLL als Erweiterung für mein Programm
 
du kannst die DLL statisch und dynamisch einbinden

dynamisch ist späteres "hinzuladen" bei schon laufendem programm -> das ist das was du brauchst

Manzoni 25. Jul 2004 22:36

Re: DLL als Erweiterung für mein Programm
 
Schau mal hier. Hoffe dir hilft das Tutorial weiter.

F.W. 25. Jul 2004 22:40

Re: DLL als Erweiterung für mein Programm
 
Mit den Infos werd ich sicher was anfangen können!! Ich schaus mir aber erst morgen an (geh jetzt ertsmal ins Bett).

-> Wenns Probleme oder Fragen gibt, meld ich mich nochmal!

Danke! :thuimb:

F.W. 26. Jul 2004 11:48

Re: DLL als Erweiterung für mein Programm
 
Die Tutorials von Delphhi-Source und Delphi-Treff sind älter und unterscheiden sich (zumindest beim statischen einladen von DLLs) zu der Methode, die ich mit Delphi 6 gelernt habe. Sollte ich die jetzt trotzdem verwenden oder geht das in D6 anders?

Die Muhkuh 26. Jul 2004 11:50

Re: DLL als Erweiterung für mein Programm
 
Das mit dem Button könntest du so lösen:

Delphi-Quellcode:
if FileExists(<PfadzurDLL>) then
  Button.Visible := true
else
  Button.Visible := false;

F.W. 26. Jul 2004 12:18

Re: DLL als Erweiterung für mein Programm
 
Das ist ja klar. Aber um das ganze so zu gestalten muss die DLL dynamisch eingeladen werden -> Wie macht man das. Ich hab gelesen, dass man sich selbst um die Verwaltung (Laden, rausschmeißen ...) kümmern muss, nur wie genau ist jetzt das Prob. Wie gesagt, bin mir halt nicht sicher ob es in D6 genauso geht wie in den Tuts, will jetzt nichts falsches lernen. :lol:

Ultimator 26. Jul 2004 12:20

Re: DLL als Erweiterung für mein Programm
 
Natürlich geht das genauso, die Tuts sind glaub ich sogar "nur" mit Delphi 5 geschrieben.
Warum soolte es denn nicht funktionieren? :gruebel:

Probieren geht über studieren ;-)

F.W. 26. Jul 2004 12:56

Re: DLL als Erweiterung für mein Programm
 
Ja eben, alle sind mit D5 geschrieben, aber bsw. wird in die Projektdatei der Statischen DLLs dort nochmal die ganze Funktion reingeschrieben
Delphi-Source:
Code:
library Project1;

uses
  SysUtils,
  Classes;

{$R *.RES}

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result:=zahl1+zahl2;
end;

exports
  addiere;

begin

end.
Ich hab's so gelernt:
Code:
library Project1;

uses
  SysUtils,
  Classes;

{$R *.RES}

exports
 function addiere name 'addiere';

begin

end.
Und da ist je schon ein kleiner Unterschied ;-)

Spezi1980 26. Jul 2004 14:19

Re: DLL als Erweiterung für mein Programm
 
Wie es so schön heist "viele Wege führen nach Rom".
Es sind beide möglichkeiten richtig.

Delphi-Quellcode:
library Project1;

uses
  SysUtils,
  Classes;

{$R *.RES} 

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result:=zahl1+zahl2;
end;

exports
  addiere;
   {verweist auf das addiere oben, was genauso exportiert wird wie es oben dasteht
    um das so zu verwenden muß die Funktion vor dem export schon mal vorkommen,
    damit der compiler weis wie es richtig ist. }

  function addiere name 'add';
   {damit kann ich der Funktion einen anderen namen geben, quasi ist der name der
    funktion in der Unit addiere und wenn du die unit später von deinem programm
    aus der dll aufrufst dann heist sie add}
 

begin

end.

F.W. 26. Jul 2004 17:04

Re: DLL als Erweiterung für mein Programm
 
Aha! Nagut.

Ich habe ein bestehendes Programm (für mein Netzwerk) versucht mit einer DLL auzustatten, weil oft Updates kommen und da ist es praktisch, wenn eben nur der dauerupdateteil der in der DLL liegt durch ein Update der DLL geupdatet wird. (Viele updates was? :-D )

1. Das Programm darf nur einmal starten, dafür hab ich folgenden Code verwendet:
Delphi-Quellcode:
Initialization //Verhindern, dass das Programm mehrmals gestartet wird
 mHandle := CreateMutex(nil, True, 'LANTool_NoDes.exe');
 if GetLastError = ERROR_ALREADY_EXISTS then begin
    MessageDlg('LAN-Tool ist schon gestartet!!', mtInformation, [mbOk], 0);
    Halt;
 end;

finalization
 if mHandle <> 0 then CloseHandle(mHandle);
Seit dem Hinzufügen der DLL kommt grundsätzlich die Messagebox.

2.Ich greife von der DLL auf ein Formular zu (das Formular, wo die function für die DLL deklariert ist), allerdings kommen da Zugriffsverletzungen aus der DLL -> Was machen?

Danke!

Luckie 26. Jul 2004 17:06

Re: DLL als Erweiterung für mein Programm
 
Zum Thema Formulare in DLL's kuck dir mal das DLL Tutorial von Assarbad an: http://www.luckie-online.de/Downloads/Importe/Assarbad/

fkerber 26. Jul 2004 17:42

Re: DLL als Erweiterung für mein Programm
 
Hi!

Zum Thema Plugin für die eigene Anwendung:
http://www.delphipraxis.net/internal...ect.php?t=5390

Evtl. ist das ein anderer Ansatz, weiß ich leider nicht, aber vielleicht hilft es ja.

Ciao fkerber

F.W. 26. Jul 2004 17:46

Re: DLL als Erweiterung für mein Programm
 
@Luckie: Wie ich Formulare in DLLs bekomme weiß ich, aber meine DLL greift auf das TRichEdit im MainFormular zu. Also ich denke mal, dass es daran liegt.
Nochmal meine Frage: Ist es möglich aus einer DLL auf Objekte der Anwendung zuzugreifen? Und wenn ja, wie sieht dann das Musterbeispiel aus?

Ich habe bisher nur die Unit des Hauptformulars in die Uses-Klausel der DLL-Unit eingegeben.

Luckie 26. Jul 2004 19:59

Re: DLL als Erweiterung für mein Programm
 
Zitat:

Zitat von F.W.
Ich habe bisher nur die Unit des Hauptformulars in die Uses-Klausel der DLL-Unit eingegeben.

Das wird so nicht klappen. Woher soll die kompilierte DLL die Komponenten deiner Hauptform kennen. Über gib einen Zeiger der des Richedits an die Funktion in der DLL:

F.W. 27. Jul 2004 18:54

Re: DLL als Erweiterung für mein Programm
 
Ich habe jetzt eine Funktion SetPointer in die DLL aufgenommen, mit der wird im OnCreate des Progs das Hauptfenster (darauf greift die DLL auch noch zu bzw. soll sie) und ein TRichEdit übergeben:

Auszug aus DLL:
Delphi-Quellcode:
uses
  SysUtils, Forms, ComCtrls, Graphics,
  Main_Unit;

var
 TheRichEdit: TRichEdit;
 TheMain: TMain;

  function SetPointer(ARichEdit: TRichEdit; AMain: TMain): Boolean; export;
  function SetSettings(S: String): Boolean; export;
  procedure Schreibe(S: String; AFont: TFont); export;

implementation

function SetPointer(ARichEdit: TRichEdit; AMain: TMain): Boolean; export;
begin
 Result := False;
 TheMain := AMain;
 TheRichEdit := ARichEdit;
 Result := True;
end;
Allerdings musste ich, weil ich ja TMain angegeben habe die Main_Unit (Hauptformular des Progs) mit reinnehmen.
Aber so funktioniert es nicht. Muss ich vielleicht als Übergabeparameter Pointer nehmen?


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