Hi,
also das deine Funktion so langsam ist, dürfte wohl damit zusammenhängen, dass du die jedes mal neu lädst. Das kostet natürlich Zeit, bedingt aber natürlich auch den Unterschied zwischen dynamischem und statischem Linken.
Wie auch immer, der Speicherbedarf ist halt eine andere Sache.
Lädst du jetzt eigentlich 200 mal die
Dll und rufst dann die Funktion auf (also auch verschiedene dlls) oder lädst du einmal und kommt dann nach 200 Funktionsaufrufen das Problem?
Letzteres spricht natürlich für allozierten Speicher in der Funktion (und in ihren Funktionsaufrufen), der nicht freigegeben wird. Einerseits natürlich direkt in der Funktion, wenn du etwas erzeugst, musst du es explizit wieder freigeben, aber halt auch bei der Übergabe von Parametern musst du aufpassen. Wenn du die Parameter jedes mal neu erzeugst ohne die alten vorher freizugeben, z.B.:
Delphi-Quellcode:
function doFoo;
begin
self.myBitmap := TBitmap.Create;
// assign sth. to myBitmap
....
myFunction(self.myBitmap)
end;
Dann hast du zwar immer genau die erwartete Bitmap an myFunction übergeben, aber jedes TBitmap.Create legt eine neue Bitmap an. Die Zuweisung ist dabei nur eine Zuweisung der Referenz self.myBitmap auf eine Bitmap, was mit der "Alten" passiert, auf die myBitmap nur gezeigt hat, ist Delphi egal. Die müsstest du mit einem self.myBitmap.Free natürlich freigeben.
Sorry wenn du das alles schon weißt und dich jetzt gelangweilt fühlst, aber kann man schnell mal drin haben.
Dann natürlich dynamische Arrays mit finalize(Array) ebenso freigeben.
Und zu guter letzt kommt natürlich noch eins in Frage, du benutzt loadLibrary, ähnlich wie gerade in doFoo erklärt, solltest du auch hier das
Handle freigeben und deine Funktion um ein FreeLibrary erweitern.
Delphi-Quellcode:
TMainform.button1click(Sender: TObject);
begin
if OutputDLL <>
nil then
begin
if not FreeLibrary(OutputDLL)
then
begin
// Fehler beim freigeben der DLL
raise ...
end;
// if not FreeLibrary(OutputDLL)
end;
// if OutputDLL <> nil
OutputDLL :=LoadLibrary(PChar('
c:\meinplugin.dll'));
@DLLSenddata := GetProcAddress(OutputDLL,'
DLLSenddata');
end;