Hallo,
ich bin mir nicht sicher ob das Thema am besten hierher passt, also schon mal Sorry falls es fehl platziert wurde. Ich beschäftige mich gerade mal wieder mit einer Art Plug-In-System für mein Lüftersteuerungsprogramm
PFControl für ThinkPad-Notebooks.
Die jeweiligen
DLL's sollen eine Standard-Routine besitzen, dir mir Informationen über sie gibt (Autor, Version, ...). Dabei soll die
DLL dynamisch geladen, die Informationen gelesen und im Speicher hinterlegt, und wieder freigegeben werden. In meiner
DLL befindet sich also folgende Funktion:
Delphi-Quellcode:
function GetDllInformation: TDllInformation;
begin
Result.Author := 'Max Mustermann';
Result.Version := 'v0.2';
Result.Name := 'Standard-Signale';
end;
Diese Funktion wird exportiert und in meinem Hauptprogramm folgendermaßen aufgerufen:
Delphi-Quellcode:
...
TFunctionGetDllInformation =
function: TDllInformation;
...
fInfo: TDllInformation;
...
constructor TDll.Create(FileName:
String);
var
Func: TFunctionGetDllInformation;
begin
Inherited Create;
fFileName := FileName;
fDllHandle := 0;
Load;
Func := LoadFunction(DLL_GETINFO);
fInfo := Func;
Unload; /* Marke 1 */
fLoaded := False; /* Marke 2 */
end;
procedure TDll.Load;
begin
fDllHandle := LoadLibrary(PChar(fFileName));
if fDllHandle = 0
then
raise Exception.Create('
"'+fFileName+'
" konnte nicht geladen werden!');
fLoaded := True;
end;
function TDll.LoadFunction(
Name:
String): Pointer;
begin
try
Result := GetProcAddress(fDllHandle, PChar(
Name));
except
on E:
Exception do
raise Exception.Create('
"'+fFileName+'
" ist keine gültige Dll für PFControl: '+E.
Message);
end;
end;
procedure TDll.UnLoad;
begin
if fLoaded
then begin
FreeLibrary(fDllHandle);
fLoaded := False;
end;
end;
Zunächst funktioniert alles perfekt bis /* Marke 1 */ im Konstruktor. Wenn die Prozedur Unload noch nicht aufgerufen wurde, stehen in fInfo (Struktur) die gewünschten Daten. Nachdem Unload aufgerufen wurde (/* Marke 2 */), ist fInfo im Debugger nicht mehr lesbar und die Daten sind weg. Wieso bleiben die Daten beim Freigeben der
DLL nicht erhalten bzw. wie kann ich es so lösen ohne die
DLL dauerhaft im Speicher zu lassen?
Ich nutze Borland Delphi 7 unter Windows XP.
Gruß
Profiler