Einzelnen Beitrag anzeigen

Profiler

Registriert seit: 30. Dez 2006
14 Beiträge
 
#1

[DLL]Daten weg nach FreeLibrary

  Alt 23. Apr 2009, 19:43
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
  Mit Zitat antworten Zitat