Einzelnen Beitrag anzeigen

Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#1

Wie Funktion einer DLL hundertfach hintereinander aufrufen??

  Alt 9. Okt 2005, 18:11
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
Christian Nöding
  Mit Zitat antworten Zitat