Hallo,
Heute abend mal wieder eine
DLL-Frage, da ich im Forum nichts passendes gefunden habe. Also: nachdem ich nun mit
DLL-Programmieren und der dynamischen Einbindung derselben ein wenig Fuß gefasst habe, möchte ich eine bestimmte Funktion meines Programmes in eine
DLL auslagern, damit man durch austauschen der
DLL verschiedene Dinge mit den Parametern der Funktion anstellen kann, ohne das ganze Programm neu zu kompilieren (-> also eine Plugin-
DLL)
Die
DLL läuft soweit einwandfrei ohne ShareMem nur mit übergabe von PChars und mit Funktionsaufrufen über stdcall. Ich kann die
DLL laden und auch die Funktionen und Forms laden, allerdings steigt mit jedem Funktionsaufruf die Speichermenge, die mein Programm verwendet und nach etlichen Aufrufen (>200) kratzt mir Delphi komplett mit Speicherfehlern ab (wahrscheinlich weil ich über meinen physikalischen
RAM rausgehe)
Und das habe ich bisher programmiert:
Die
DLL:
Delphi-Quellcode:
library pc_dimmer_com;
uses
Forms,
SysUtils,
Classes,
Windows,
configfrm in 'configfrm.pas' {Config},
aboutfrm in 'aboutfrm.pas' {About};
{$R *.res}
procedure DLLSenddata(address:integer; ftime:longint; level,st,fadetime_ms:integer);stdcall;
begin
// hier der Funktionscode (der läuft ja, also lasse ich ihn hier weg)
end;
exports
DLLSenddata;
begin
end.
und hier der Code, mit dem ich die
DLL-Funktion aufrufe:
Delphi-Quellcode:
unit PCDimmer;
interface
uses
{blablabla};
type
TDLLSenddata =
procedure(address:integer; ftime:longint; level,st,fadetime_ms:integer);
stdcall;
TMainForm =
class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm : TMainForm;
OutputDLL: THandle;
DLLSenddata:TDLLSenddata;
implementation
{$R *.DFM}
TMainform.button1click(Sender: TObject);
begin
OutputDLL :=LoadLibrary(PChar('
c:\meinplugin.dll'));
@DLLSenddata := GetProcAddress(OutputDLL,'
DLLSenddata');
end;
TMainform.scrollbar1change(Sender: TObject);
begin
DLLSenddata(address,ftime,level,st,fadetime_ms);
end;
end.
Diesen Sourcecodeschnippsel habe ich jetzt eben aus meinem Hauptprogramm rausgeschrieben, ich hoffe ich habe nichts vergessen. Also ich lasse mir alle
dll-Dateien in einem bestimmten Verzeichnis suchen und in einer Listbox anzeigen. Dann kann ich mit einem Button eine bestimmte Datei laden und die Funktion DLLSenddata mit der
DLL-Funktion verbinden (Pointer setzen).
Wie gesagt, einige Male läuft die Funktion mit der Parameterübergabe, allerdings bereits nicht schnell. Ich hatte die
DLL-Funktion DLLSenddata(...) vorher in der exe direkt drin und da flitzte die Funktion. Ausgelagert in der
DLL schleicht die Funktion und frisst unmengen Speicher. Ich habe leider keine Ahnung, wo ich jetzt den Fehler suchen soll.
Vielleicht kann mir ja einer einen Tipp geben *g* Danke!
ciao, Christian