Hmm, erst mal danke für die Antwort...
ich lade die
DLL (zur Laufzeit) nur einmal und rufe dann die Funktion nur sehr oft hintereinander auf. In der
DLL-Funktion "DLLSenddata" wird (leider) überhaupt nichts erzeugt, was ich freigeben könnte. Ich rechne mit den Parametern nur ein bisschen rum, mache ein paar Bitverschiebungen und schiebe das ganze dann über den
Com-Port mit einer Comport-Komponente raus.
Ich habe bisher auch nicht versucht, die
DLL einmal statisch beim Programmstart zu laden... ich bin davon ausgegangen, dass die DLLs beim Laden zur Laufzeit sich nicht anders verhalten, wenn man sie nur einmal läd.
Also nochmal zusammen gefasst:
Delphi-Quellcode:
OutputDLL := LoadLibrary(PChar('c:\plugin.dll'));
@xDLLSenddata := GetProcAddress(OutputDLL, 'DLLSenddata');
und dann eben zum Beispiel über ne Scrollbar hintereinander (mit sich ändernden Parametern):
Delphi-Quellcode:
for i:=1 to 127 do
xDLLSenddata(i,0,scrollbar1.position,1,0);
und mit jedem Ausführen der
DLL-Funktion wird der Durchlauf immer langsamer :-/ das ist bei der Funktion im Exe-Code nicht passiert. Es muss also irgendwas im Speicher passieren. Eine nicht durchgeführte Freigabe, wie du sagst, klingt einleuchtend, nur was?
Hier mal der komplette Code der
DLL:
Delphi-Quellcode:
library pc_dimmer_com;
uses
Forms,
SysUtils,
Classes,
Windows,
configfrm
in '
configfrm.pas'
{Config},
aboutfrm
in '
aboutfrm.pas'
{About};
{$R *.res}
function DLLGetName:PChar;
stdcall;
begin
Result := PChar('
230V 128 Kanal PC_DIMMER');
end;
function DLLGetVersion:PChar;
stdcall;
begin
Result := PChar('
v1.0');
end;
procedure DLLConfigure;
stdcall;
var
dllForm: TForm;
begin
dllForm :=TConfig.Create(Application);
try
dllForm.ShowModal;
finally
dllForm.Release;
end;
end;
procedure DLLAbout;
stdcall;
var
dllForm: TForm;
begin
dllForm :=TAbout.Create(Application);
try
dllForm.ShowModal;
finally
dllForm.Release;
end;
end;
procedure DLLSenddata(address:integer; ftime:longint; level,st,fadetime_ms:integer);
stdcall;
var
b:byte;
t3,t2,t1:byte;
rs232frame:
array[0..5]
of Byte;
begin
// Routine für COM1 bis COM16
// im Puffer alles auf 0 setzen
FillChar(rs232frame, SizeOf(rs232frame), 0);
dec(address);
b:=address;
b:=b
or $80;
{erste byte high für Synchronisation}
rs232frame[0]:=b;
{erste Byte in Puffer schreiben}
//Steps in Byte 2 schreiben
dec(st);
b:=0;
b:=b
or st;
rs232frame[1]:=b;
{zweite Byte in Puffer schreiben}
// Fadezeiten in Byte 3..5 senden
t1:=(lo(ftime)
and $7F);
ftime:=ftime
shr 7;
t2:=(lo(ftime)
and $7F);
ftime:=ftime
shr 7;
t3:=(lo(ftime)
and $7F);
rs232frame[2]:=t3;
{dritte Byte in Puffer schreiben}
rs232frame[3]:=t2;
{vierte Byte in Puffer schreiben}
rs232frame[4]:=t1;
{fünfte Byte in Puffer schreiben}
// Endwert im Byte 6 senden
b:=level
and $7F;
rs232frame[5]:=b;
{sechste Byte in Puffer schreiben}
Application.CreateForm(TConfig, Config);
config.comport.SendData(@rs232frame,6);
end;
exports
DLLGetVersion,
DLLGetName,
DLLConfigure,
DLLAbout,
DLLSenddata;
begin
end.
dieser Sourceschnippsel oben sollte direkt kompilierbar sein, wenn man die configfrm und aboutfrm rausnimmt... danke für jeden weiteren Tipp
schönen Abend noch,
Christian!
PS: keine Ahnung, obs was bringt, aber ich habe mal die fertig kompilierte
DLL mit in den Anhang gehängt...