![]() |
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 |
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) |
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:
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.
procedure Meine Procedure;
externen ' Meinendll.dll'; |
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; |
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
|
Re: procedure in dll auslagern
Statt dem zweiten Teil kannst du auch
Delphi-Quellcode:
verwenden.
procedure myProcedureOne; stdcall; external 'myProcedures.dll';
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. |
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 |
Re: procedure in dll auslagern
wenn du die prozedurnamen kennst könntest du dir die LoadProcedureFromDll wie folgt umbauen
Delphi-Quellcode:
ich hoff ich hab jetz kein mist geschrieben :)
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; hab hier kein delphi zum testen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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