Problem z automatycznym zwalnianiem interfejsów

0

Cześć, jak wiadomo, każdy interfejs ma pole RefCount. Jeśli jego wartość spadnie do zera, interfejs jest zwalniany. I tu pojawia się mój problem. Mam aplikację opartą o pluginy i 2 interfejsy. Jeden jest używany w aplikacji głównej do wywoływania metod w pluginie(A), a drugi jest używany w pluginie do wywoływania metod w aplikacji głównej(B)(metody w stylu: savelog, logError, etc).

I teraz tak, w momencie gdy aplikacja odłącza plugin, automatycznie spada RefCount interfejsu B. I teraz nie mogę podłączyć innego pluginu(bez restartu aplikacji), ponieważ RefCount spada do zera i interfejs jest zwalniany. W jego miejsce w pamięci wchodzą inne rzeczy.

Obszedłem to w taki sposób, że po stworzeniu obiektu implementującego interfejs B, wywołuję na nim _AddRef. I to właściwie załatwia sprawę. Tylko wszędzie piszą, żeby nie wywoływać _AddRef. Więc moje pytanie jest takie: Czy mogę tak to zostawić, czy lepiej zamiast wywołać _AddRef zrobić jakieś "sztuczne przyrównanie"? Oczywiście wiem, że w przypadku _AddRef, powinienem zrobić _Release przed zwolnieniem obiektu(mam tu na myśli przyrównanie nil do obiektu).

0

a jak masz zadeklarowane interface.
Mam dokladnie taka sama konstrukcje w platformie ktora napisalem i nie ma problemu.
Host aplikacji jest interfacem

IHostInterface = interface ... 

W pluginie jest interface IPluginVisualInterface = interface ...

Laduje dynamicznie dll i wolam funkcje ktora w wyniku zwraca obiekt IPluginVisualInterface.
Trzymam go w zmiennej.
Po odlaczeniu dll zwalniam zmienna interface plugina.
Plugin sam zwalnia swoje formy.
Do osadzania uzywam Winapi SetParent itp.

0

Dokładnie chodzi o to, że jak zwolnię plugin w trakcie działania aplikacji, to nie ma już żadnych referencji do HostInterfejs. I on się zwalnia automatycznie. I teraz jeśli chcę podłączyć jakis nowy plugin i przekazuje mu HostInterface, to wtedy się pojawia błąd w pewnym momencie, bo w miejscu, gdzie powinien być HostInterface jest już zupełnie coś innego. SetParent tutaj nie używam, ponieważ to nie jest aplikacja okienkowa. Usługa uruchamia sobie pluginy.

0

dokladnie.
Plugin trzyma u siebie w zmiennej wartosc HostInterface.
Po zamknieciu pluginu sama sie niszczy - ps musi to byc zmienna klasy a nie globalna

1

Dla HostInterface trzymaj w aplikacji dwa odwołania: przez wskaźnik na obiekt i przez interfejs.
Wskaźnik na obiekt - jeśli chcesz operować na czymś więcej, spoza interfejsu.
Interfejs - do kontroli liczby referencji.
Jeśli nie chcesz zwalniać obiektu HostInterface przy zwalnianiu interfejsu, możesz nadpisać _Release.
Zobacz jak wygląda to wzorcowo w TInterfacedObject i odpowiednio dostosuj:

http://edn.embarcadero.com/article/30125

0

Bardzo fajny art.

1 użytkowników online, w tym zalogowanych: 0, gości: 1