Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   aus dll code in hauptanwendung ausführen (https://www.delphipraxis.net/106844-aus-dll-code-hauptanwendung-ausfuehren.html)

lbccaleb 17. Jan 2008 15:48


aus dll code in hauptanwendung ausführen
 
moin,

hilfe ich steh gerade auf dem schlauch...
wie kann ich denn, wenn ich aus einer bibliothek (dll) auf einen button drücke, eine aktion in meinem hauptformular ausführen??

was gibt es da für möglichkeiten??

QuickAndDirty 17. Jan 2008 15:50

Re: aus dll code in hauptanwendung ausführen
 
Du must der DLL eine Callback Methode bzw. Eine Callback Funktion übergeben!!!

lbccaleb 17. Jan 2008 15:54

Re: aus dll code in hauptanwendung ausführen
 
wie genau mach ich das ?? hab sowas noch nie gemacht und wenn ich ehrlich bin von nix nen plan!!

gibts vllt irgend wo nen code wo man sich sowas ansehen kann wie das funzt oder nen tutorial??

Blackheart 17. Jan 2008 16:05

Re: aus dll code in hauptanwendung ausführen
 
http://www.delphi-treff.de/tutorials...s/katalog/182/

QuickAndDirty 17. Jan 2008 16:06

Re: aus dll code in hauptanwendung ausführen
 
Du brauchst in der DLL eine Funktion die eine procedurale variable als Parameter entgegennimmt und speichert.
Delphi-Quellcode:
type
TCallback = Procedure (aValue:String); // das ist ein Prozeduraler typ
Delphi-Quellcode:
// im DLL

var OnClickProc:TCallback; // hier wird die Procedur im DLL Gespeichert

Procedure SetCallback(aProc:TCallback);// Das hier musst du aus der DLL Exportieren damit andere es aufrufen können
Begin
  OnClickProc := Aproc;
end;

Procedure Form1.Onclick(Sender:Tobject);
Begin
  if assigned(onclickProc) then
    OnclickProc('hau rein');
end;
SO IN ETWA.

lbccaleb 17. Jan 2008 16:24

Re: aus dll code in hauptanwendung ausführen
 
danke für das tutorial @blackheart, aber leider konnte ich dort nichts drin ausfindig machen, was mir in sachen callback weiter hilft, bzw wo ich stoff finde, der mir diese funktion mal ein wenig nahe legt..

und der code sieht ja schon ganz gut aus, nur leider weiß ich noch nciht so richtig wie ich das alles verwenden muss, könntest das vllt noch mal ein wenig "mehr" kommentiren?? danke..

1234588 17. Jan 2008 16:55

Re: aus dll code in hauptanwendung ausführen
 
ein funktionspointer ist nicht unbedingt noetig.

deine dll:
Delphi-Quellcode:
library miep;

function add(i: LongInt): LongInt; stdcall;
begin
  add := i * 2;
end;

exports
  add index 1 name 'add';

begin
end.
im hauptprogramm fuegst du einfach folgende zeile in deinen implementation teil hinzu:
Delphi-Quellcode:
function add(i: LongInt): LongInt; stdcall; external 'miep.dll';
die add funktion ist von da an dann nutzbar.


//edit
in obigem code wird ein String als argument verwendet. das sollte man unbedingt vermeiden.
1. funktioniert da nicht ohne weiteres (siehe sharemem)
2. kennt keine andere sprache den pascal string. ergo ist sie nur mit pascal verwendbar

QuickAndDirty 17. Jan 2008 17:12

Re: aus dll code in hauptanwendung ausführen
 
Ja das mit dem string geht nur wenn du sharemem als erstes in die uses schreibst...
sonst nimmst halt einen Pchar.

Wenn du die DLL universell einsetzbar machen willst so das die unterschiedliche anwendungen auf ereignisse unterschiedlcih reagiren brauchst du schon eine CallBack Procedur in der du die "Reaktion" unterbringst.

Wie man DLL Funtionen in der Anwendung nutzbar macht steht ja hier über dem Post. Der umgekehrte weg geht nur über callback.

lbccaleb 17. Jan 2008 17:13

Re: aus dll code in hauptanwendung ausführen
 
ähhm ja aber in dem fall muss die bibliothek vorhanden sein wenn ich ohne fehlermeldung das programm starten und ausführen will?? richtig??

ok da gibts dann bei mir aber nen kleines problem, es muss gleichzeitig so programmiert sein, das ich die dll nicht benötige um das programm zu starten!


diese dll ist bei mit nämlich eine "plugin" dll die hilfe formen enthält, und man soll/kann bei der installation diese dll abwählen...

das ist also noch nen kleiner hacken..

QuickAndDirty 17. Jan 2008 17:19

Re: aus dll code in hauptanwendung ausführen
 
-Du must erst das DLL mit LoadLib importieren.
-Dann alle Exports des DLL in Procedurale Variablen laden mit GetProcAddr

Jetzt kannst du alle DLL Funtkionen in deinem projekt benutzen.
Vergiss nicht FreeLib wenn du sie nicht mehr brauchst.

Wenn du nun willst das dein Programm was macht wenn ein ButtonClick in der DLL passiert
dann must du der DLL eine Callback procedur übergeben.

Mal ne Frage warum nimmst du eine DLL und kein Package?

lbccaleb 17. Jan 2008 17:29

Re: aus dll code in hauptanwendung ausführen
 
Zitat:

Zitat von QuickAndDirty
Mal ne Frage warum nimmst du eine DLL und kein Package?


ich weiß nicht ;-)

was genau meinst du??

naja ansonnsten wollte ich es auch eigentlich nicht mehr ändern, das ist schon aus früheren programmierzeiten..


edit:

achja, den aufruf für die dll und so hab ich schon, wie gesagt die läuft schon, nur will ich halt jetzt einen opendialog aus der dll starten..

1234588 17. Jan 2008 17:43

Re: aus dll code in hauptanwendung ausführen
 
Zitat:

Zitat von QuickAndDirty
Wenn du die DLL universell einsetzbar machen willst so das die unterschiedliche anwendungen auf ereignisse unterschiedlcih reagiren brauchst du schon eine CallBack Procedur in der du die "Reaktion" unterbringst.

[ot]
mit funktionspointern zu arbeiten macht nicht immer sinn. will man einfache funktionen auslagern bzw. will man sein programm durch ersetzen der dll aktualisieren, ist es sicher sinnvoller wenn man seine dll statisch benutzt. funktionen die vom programm unbedingt gebraucht werden, sollten auch verfuegbar sein. ist die dll nicht verfuegbar, startet das programm erst garnicht. wird die addresse zur funktion zur laufzeit ausgelesen, muesste man manuelles exception handling betreiben (á al 'das programm benoetigt die dll 'miep.dll')
=> mehr aufwand als es wert ist

ein funktionspointer macht sinn, wenn man sein programm durch eine dll erweitern moechte (wie im obigen bsp. if Assigned() then ..).
will man eine unbestimmte anzahl von dll's benutzen, kann man das nur dynamisch (macht ja auch sinn. man kann ja nicht wissen, wieviele dll's noch hinzu kommen werden).

dynamisches benutzen von dll's recht & gut, die benutzung muss aber auch gerechtfertigt sein. imho sind die ganzen winapi funktionen auch nicht dynamisch, sondern statisch niedergeschrieben.
[/ot]

Zitat:

diese dll ist bei mit nämlich eine "plugin" dll die hilfe formen enthält, und man soll/kann bei der installation diese dll abwählen...
ganz einfach. eine dll ist ein fast-programm :o)
eine dll sieht im grunde genau so aus wie ein normales programm. du erstellst einfach dein hilfe fensterchen (als waere es ein anderes programm), speicherst es und oeffnest die *.dpr datei (in einem editor!).
gleich in der ersten zeile aenderst du das 'program' in ein 'library'.
fertig.

benutzen kannst du das ding mit einem einfachen Loadlibrary() call. du mappst einfach die dll in den speicher und dein form fenster wird erstellt. idr. sollte das ding wieder freigegeben werden, sobald das fenster (welches aus der dll gestartet wurde) beendet wird. sollte man versuchen. ansonsten einfach mit FreeLibrary() freigeben :o)

QuickAndDirty 18. Jan 2008 07:10

Re: aus dll code in hauptanwendung ausführen
 
@1234588:
Wenn er dem programm aus der DLL heraus ein onClick ereignis zur verfügung stellen will geht es nur über eien CallBack Prozedur.
Und er hat ja gesagt er will im Programm auf eben ein OnClick auf einen Button reagieren. Dann muss er wohl das Ereignis per Funktionspointer zuweisen können also die Adresse des Ereignisses der DLL bekannt geben.

Das ist die Lösung für das von ihm im ersten Post gestellte Problem.

Wie er die DLL im Program verfügbar macht hat mit dem Problem nichts zu tun und ist eine philosophische Frage.

Ich persönlich würde wenn ich davon ausgehen kann das ich der einzige bin der an dem Programm entwickelt eine BPL nehmen.
Da kann ich die Classen und Objekte direkt benutzen. Aber wenn er halt ne DLL gemacht hat...

@IBCCalleb:
hast du im dll eine "exports" Klausel die eine Methode zum starten des Dialogs exportiert?

lbccaleb 18. Jan 2008 11:26

Re: aus dll code in hauptanwendung ausführen
 
Zitat:

Zitat von QuickAndDirty
@LBCCalleb:
hast du im dll eine "exports" Klausel die eine Methode zum starten des Dialogs exportiert?

ja hab ich, und funktioniert, es geht mir halt immer nur noch darum wie ich diese verflixte callback methode reinbringen kann, bin da noch nciht wirklich weiter gekommen ;-(

hab jetzt aber noch was im internet gefunden unter:

tutorial
und noch was in der dp:

dp dll

ich hoffe mal es hilft mir weiter hab nur gerade keine zeit dafür mach ich montag weiter mit....
aber für tipps, währe ich trotzdem noch offen, wie ich das ereignis auf dem simplen button click in meiner hauptanwendung reagieren kann...

1234588 18. Jan 2008 15:28

Re: aus dll code in hauptanwendung ausführen
 
Zitat:

Zitat von QuickAndDirty
@1234588:
Wenn er dem programm aus der DLL heraus ein onClick ereignis zur verfügung stellen will geht es nur über eien CallBack Prozedur.
Und er hat ja gesagt er will im Programm auf eben ein OnClick auf einen Button reagieren. Dann muss er wohl das Ereignis per Funktionspointer zuweisen können also die Adresse des Ereignisses der DLL bekannt geben.

wir sind uns einig, das die funktionen in der windows.pas statisch deklariert sind? statisch im sinne von
function SendMessage(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM):LRESULT; external 'user32' name 'SendMessageA';

okay, was ist dann das?
Delphi-Quellcode:
uses windows;

begin
  writeln('0x', longint(@SendMessage));
  readln;
end.
die addresse ist also sehr wohl bekannt :o)

es ist moeglich, die OnClick property zu ueberschreiben. mit was man diese procedure ueberschreibt kann dem compiler egal sein (solange die aufrufkonvektion & groeße der argumente stimmt). was spricht also dagegen, das man das mit einer statisch eingebunden funktion/prozedur aus einer dll macht? wers mag kann ja auch die prozedur aus der dll in der OnClick prozedur aufrufen.

jetzt sagst du mir bitte, was daran nicht machbar ist?

Zitat:

Wie er die DLL im Program verfügbar macht hat mit dem Problem nichts zu tun und ist eine philosophische Frage.

Ich persönlich würde wenn ich davon ausgehen kann das ich der einzige bin der an dem Programm entwickelt eine BPL nehmen.
Da kann ich die Classen und Objekte direkt benutzen.
ich persoenlich finde nicht, das das eine philosophische frage waere. es ist eher eine frage der funktionalitaet. wenn eine dll fest benutzt werden soll, warum dann dynamisch? imho ist das mehr aufwand den man sich getrost sparen kann.
uebrigens kann man auch objekte ueber dll's benutzen. man muss nur auf beiden seiten die klassen deklaration haben ;)

Zitat:

ja hab ich, und funktioniert, es geht mir halt immer nur noch darum wie ich diese verflixte callback methode reinbringen kann, bin da noch nciht wirklich weiter gekommen ;-(
die dll laesst du so wie sie ist. in deinem programm, welches die prozedur aus der dll aufrufen soll schreibst du folgendes:

Delphi-Quellcode:
procedure start;
var
  proc: procedure;
  lib: LongWord;
begin
  lib := LoadLibrary('deine dll');
  if lib <> 0 then
  begin
    proc := GetProcAddress(lib, 'dein_proceduren_name');
    if Assigned(proc) then proc;
  end;
end;
ich weiß nicht, wie die prozedur in der dll aussieht, deshalb muesstest du evtl. zeile 3 (proc: procedure) anpassen. des weitern musst du noch den namen deiner dll in zeile 6 aendern und den namen der prozedur in zeile 9 eintragen.
außerdem kannst du bei bedarf die moeglichen fehler behandeln (wenn lib = 0 oder wenn Assigned() = false waere).

problem ist, das du die hilfe-schaltflaeche dann immer sichtbar bzw. dueckbar haben musst. das laesst sich aber auch eleganter loesen. pruefe einfach im form create ob die dll vorhanden ist, oder noch besser ob die funktion die du importieren moechtest, vorhanden ist (siehe bsp. -> wenn Loadlibrary() 0 zurueck gibt, ist die dll entweder nicht vorhanden oder fehlerhaft. mit Assigned() pruefst du dann, ob die prozedur vorhanden ist). je nach dem kannst du dann die hilfe schaltflaeche anzeigen, drueckbar machen, oder was auch immer.

ich hoffe, ich hab das einigermaßen verstaendlich rueber gebracht, hatte gerade feierabend =)

QuickAndDirty 14. Apr 2008 22:32

Re: aus dll code in hauptanwendung ausführen
 
Hallo, du hast ihm erklärt wie man eine Procedure aus einer DLL einbindet. Das ist ganz normaler standard.
Jetzt kann er immer noch keine Anwedungsmethode der DLL als Ereigniss zuweisen.


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