Ich habe für ein Projekt einen Modulmanager gebastelt und habe mich entschieden ihn hier für andere bereitzustellen.
[url]gauss.euv-frankfurt-o.de/~dittrichc/moduleman.zip[/url]
Der Download enthält zwei Dateien, lists.pas und moduleman.pas. modulman.pas enthält den kompletten Modulmanager und lists.pas eine Pointerliste. Wenn ihr lists.pas im Hauptprogramm oder wo anders einbindet, dann achtet darauch, dass diese
nach Classes eingebunden wird, da diese auch eine Klasse TPointerList implementiert. Das wird aber noch geändert. Zur Zeit kann man in die Listen nur etwas einfügen, was aber für den Zweck der Parameterübergabe reicht.
Falls ihr den Modulmanager benuzen möchtet, dann reicht es eigentlich nur die modulman.pas einzubinden, aber ich habe die Export-Funktionen so angelegt, dass sie auf die Klasse TPointerList(Nicht die von Borland!) aus lists.pas zurückgreift.
Der Modulmanager benutzt normale DLLs als Module, diese müssen aber einige Besonderheiten erfüllen:
1. Es muss eine Funktion mit dem Namen "GetFunctions" vorhanden sein, die die Namen der Funktionen in einem String mit Kommas getrennt zurückgibt, wie sie im exports-Teil der DLL benannt wurden.
2. Die Exportierten Funktionen müssen folgenden Kopf haben:
Delphi-Quelltext
1:
| function <name>(params:TSimplePointerList):TSimplePointerList; |
Dazu muss wie oben beschrieben die Unit lists.pas eingebunden werden.
Wenn ihr das beachtet, dann könnt ihr mit LoadModule ein Modul laden und mit GetFunction eine Funktion aus einem Modul aufrufen, dabei sollte bachtet werden, dass keine Namensgleichheit auftritt, das es sonst zu unerwarteten Problemen kommen kann, wenn nicht die richtige Funktion aufgerufen wird.
Ihr müsst auch ShareMem in eurer Projektdatei in den uses-Teil an erster Stelle eintragen.
Ein Bespielmodul könnte so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| library TestModul;
uses ShareMem, SysUtils, Classes, lists in 'lists.pas';
{$R *.res}
function Test(params:TSimplePointerList):TSimplePointerList; begin result:=params; end;
function GetFunctions:String; stdcall; begin result:='Test'; end;
exports
GetFunctions name 'GetFunctions', Test name 'Test';
end. |
Viel Spass!