Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi procedure in dll auslagern (https://www.delphipraxis.net/49144-procedure-dll-auslagern.html)

BastardOp 6. Jul 2005 00:33


procedure in dll auslagern
 
Hi

also ich hab gerade damit angefangen mit dlls zu arbeiten. Ich hab auch schon funktionen in die dlls gepackt und das funzt auch alles wunder bar. Aber nun wollte ich mal fragen ob ich auch proceduren in dlls auslagern kann und dann im Hauptprogramm nur noch aufführe in welche dll die procedure liegt und ein onclick ereignis dann zumbeispiel direkt aus der dll geladen wird. Das wäre bei mir sehr sinn voll da ich dann bei updates von meinem Programm nicht imer das gesamtte proggramm an alle user verteilen muss sondern nur die dlls mit den änderungen.

Ich hoffe mal ihr könnt mir helfen.

MfG
BastardOp

Robert_G 6. Jul 2005 00:55

Re: procedure in dll auslagern
 
Warum nimmst du nicht Packages?
Das sind aufgebohrte DLLs, du kannst darin deine Klassen oder auch prozedurales Zeug packen.
Einfach die betreffenden Units aus dem bisherigen Projekt werfen und in das Package packen.
Dann noch dieses Package (und alle, die in der requires Liste des Packages aufgelisteten Packages) in den Projekt optionen bei runtime packages eintragen, fertig. :)
Dein Code wird dadurch nicht beinflusst. (Bis auf Kreuzbezüge, die bei zwischen Packages nicht erlaubt sind)

BastardOp 6. Jul 2005 09:42

Re: procedure in dll auslagern
 
Also irgdwnwiekomme ich mit den Packeges nicht so wirklich zurecht. In den Proceduren wir bei mir auf Elemete eines Formular zugegriffen und diese Elemete sind in dem Package ja dann nicht drin und wie kann ich in meinem Hauptprogramm agen das halt das OnClick vonzb Button5 in dem Packge liegt?
Ich hab mir das so vorgestelle, das ich einfach meinen ganzen externen Datein ahbe und die darin liegenden Prozedure im Haupprogramm dan zb über
Delphi-Quellcode:
procedure Meine Procedure;
externen ' Meinendll.dll';
deklariere und den Inhalt der Prozeduren kan ich dann wie ich lustig bin in den exteren Datein ändern, ohne jedesmal das ganz Programm neu zu machen.

barf00s 6. Jul 2005 10:25

Re: procedure in dll auslagern
 
File -> New -> Dll Library

Delphi-Quellcode:
library myProcedures;

uses
  Windows;

procedure myProcedureOne; stdcall;
begin
  MessageBox(0, 'myProcedureOne', 'w00t', MB_OK OR MB_ICONINFORMATION);
end;

extern
  myProcedureOne;

end.
--------------

in deinem programm das die dll laden soll

Delphi-Quellcode:
procedure LoadProcedureFromDll;
var
  hDll: cardinal;
  myProcedure: procedure;

begin
  hDll := LoadLibrary('myProcedures.dll');
  if hDll <> 0 then begin
    @myProcedure := GetProcAddress(hDll, 'myProcedureOne');
    if Assigned(@myProcedure) then
      myProcedure;
    FreeLibrary(hDll);
  end;
end;

BastardOp 6. Jul 2005 10:32

Re: procedure in dll auslagern
 
irgendwie kanich dem ncith ganz folgen, muss ich da etwa für jede procedure in der dll den 2. code größenteils wieder holen? mir riechts wenn gleich zu anfrang alle proceduren der dll geladen werden

scp 6. Jul 2005 10:46

Re: procedure in dll auslagern
 
Statt dem zweiten Teil kannst du auch
Delphi-Quellcode:
procedure myProcedureOne; stdcall; external 'myProcedures.dll';
verwenden.
Aber:
Beim Dynamischen laden, wie es oben beschrieben ist, kann ein Teil deines Programms noch funktionieren, auch wenn die DLL fehlt.
Beim statischen Aufruf, wie es die eine Zeile hier macht, geht dein Programm gar nicht mehr, wenn die DLL fehlt.

BastardOp 6. Jul 2005 10:49

Re: procedure in dll auslagern
 
ok thx
ich wollte das proggie wenn ichs denn komplett auf die dlls umgestelt habe eh mit einen setup ausliefern und da sind ja dann die dlls bei

also thx für die hilfe

barf00s 6. Jul 2005 10:58

Re: procedure in dll auslagern
 
wenn du die prozedurnamen kennst könntest du dir die LoadProcedureFromDll wie folgt umbauen

Delphi-Quellcode:
function InitDll(const sFileName: string): cardinal;
begin
  Result := LoadLibrary(sFileName);
end;

procedure FreeDll(iDll: cardinal);
begin
  FreeLibrary(iDll);
end;

procedure LoadProcedureFromDll(iDll: cardinal; const sProcedureName: string; var xProcedure: pointer);
begin
  xProcedure := GetProcAddress(iDll, sProcedureName);
end;

type
  TProcedureOne = procedure; stdcall;
  TProcedureTwo = procedure(iParam: integer); stdcall;

var
  hDll: cardinal;
  xProcedureOne: TProcedureOne;
  xProcedureTwo: TProcedureTwo;

procedure WireProcedures;
begin
  hDll := InitDll('myProcedures.dll');
  if iDll <> 0 then begin
    LoadProcedureFromDll(iDll, 'ProcedureOne', {@TProcedureOne(}xProcedureOne{)});
    LoadProcedureFromDll(iDll, 'ProcedureTwo', {@TProcedureTwo(}xProcedureTwo{)});
  end;
end;
 
procedure UnWireProcedure;
begin
  FreeDll(hDll);
  xProcedureOne := nil;
  xProcedureTwo := nil;
end;

procedure Test;
begin
  if Assigned({@}xProcedureOne) then
    xProcedureOne;
  if Assigned({@}xProcedureTwo) then
    xProcedureTwo(20);
end;
ich hoff ich hab jetz kein mist geschrieben :)
hab hier kein delphi zum testen.


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