Einzelnen Beitrag anzeigen

lizardking

Registriert seit: 2. Sep 2005
76 Beiträge
 
Delphi 7 Enterprise
 
#1

TInterfaceList und lokale Referenzen

  Alt 19. Jun 2006, 23:29
Hi zusammen,

hab gerade was, was mich extrem stutzig macht.
Kurze Erlaeuterung:

Ich lade Plugin-DLLs und speichere deren Interfaces(ITWPLugin) in eine TInterfaceList(FPLugins). In einer Funktion UnloadAllPlugins sollen die Eintraege in der Liste geloescht und die jeweilige DLL entladen werden (Handle zur DLL wird im Plugin gespeichert).
Folgender Code funktioniert (ist aber sehr unschoen):

Delphi-Quellcode:
function TTWPluginManager.RemovePlugins: TStringList;
var
  i: Integer;
  LHandle: THandle;
  LPlugin: ITWPlugin;
begin
 result := TStringList.Create;
 for i := FPlugins.Count - 1 downto 0 do
 begin
   LHandle := (FPlugins.Items[i] as ITWPlugin).Handle;
   result.Add(inttostr(LHandle));
   FPlugins.Delete(i);
  end;
end;

function TTWPluginManager.UnloadAllPlugins: Boolean;
var
  i: Integer;
  LHandle: THandle;
  HandleList: TStringList;
begin
  HandleList := RemovePlugins;
  for i := 0 to HandleList.Count - 1 do
  begin
   LHandle := StrToInt(HandleList[i]);
   FreeLibrary(LHandle);
  end;
  HandleList.Free;
end;
UnloadAllPlugins ruft quasi die Hilfsfunktion RemovePlugins auf, die in einer TStringList die Handles zurueckliefert, die entladen werden koennen und entlaedt diese entsprechend. Wenn ich jetzt aber versuche das in eine Funktion zu packen, so bekomme ich 'ne AV beim FreeLibrary. Ich kann mir das nur so erklaeren, dass im Scope von RemovePlugins zusaetzliche Referenzen zu den Plugin-Interfaces entstehen. Deshalb gibt's die AV, ich versuche halt eine Library zu entladen, von der noch Objekte vorhanden sind. Verlasse ich den Scope von RemovePlugins, so werden diese Referenzen natuerlich geloescht und die Objekte korrekterweise zerstoert.

Aber an welcher Stelle schaffe ich mir diese lokalen Referenzen ?

Bin fuer jeden Hinweis dankbar. Hab zwar diesen funktionierenden Workaround, aber gerade an 'ner Pluginschnittstelle will ich nicht direkt mit Pfusch anfangen ;-)

Gruesse,

Lizzy
  Mit Zitat antworten Zitat