Einzelnen Beitrag anzeigen

1234588

Registriert seit: 14. Jan 2007
Ort: Stuttgart
164 Beiträge
 
#15

Re: aus dll code in hauptanwendung ausführen

  Alt 18. Jan 2008, 15:28
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 =)
  Mit Zitat antworten Zitat