Jak zniszczyc obiekt przypisany do interfejsu

Odpowiedz Nowy wątek
2006-12-02 20:06
0

Mam taki oto problem:

Jest klasa TKlasa, która dziedziczy metody z interfejsu IKlasa:

IKlasa = interface
  procedure Done;
end;

TKlasa = class(TComObject, IKlasa)
  procedure Done;
  constructor Create;
  destructor Destroy; reintroduce;
end;

Program wczytuje bibliotekę dll, pobiera z niej nowo stworzoną klase jako interfejs:

result := IKlasa(TKlasa.Create);

Wywoluje metode "Done"

var
  IntfKlasa: IKlasa;

begin
{. . . 
Wczytuje
. . .}

  IntfKlasa.Done;

I tutaj mam problem. Chce obiekt reprezentowany przez interfejs zniszczyć. Próbowałem rzutować IKlasa na TKlasa i wywolac Free

TKlasa( IntfKlasa ).Free;

Lecz to skutkuje wyjątkami Acces Violation (CCCCFFFF)

Macie jakieś pomysły?

//EDIT:

Chyba ma to związek z tym, że obiekt jest tworzony w funkcji w pliku dll, a próbuje zostać zniszczony w programie

Pozdrowienia, HappyHardcore

Pozostało 580 znaków

2006-12-03 23:10
dj
0

Interface's w Delphi rządzą się trochę innymi prawami niż klasy, normalnie interfejsy są zwalniane metodą _Release ale da się zauwarzyć rze to takrze wywołuje pewne błędy(wydaje mi sie że Delphi za nas zwalnia interfejsy)

Ale żeby być pewnym powinieneś sprawdzić czy jest wywoływany destruktor klasy TKlasa


Great spirits have always encountered violent opposition from mediocre minds.

Pozostało 580 znaków

2006-12-04 15:18
0

<font size="6">Żeby!!!</span>

Klasa nie dziedziczy interfejsu, tylko go implementuje. To taka mała uwaga. Kiedy tworzysz obiekt interfejsu, jego licznik odwołań jest ustawiany na 1. Przypisanie kolejnej referencji do tego samego obiektu zwiększa licznik odwołań o 1. Przy niszczeniu odwołania (zmienna kończy swój czas życia) - wywoływana jest metoda _Release, która zmniejsza licznik odwołań i jeśli licznik wynosi 0 (brak odwołań) - zwalnia obiekt. Metody _AddRef i _Release zostały poprzedzone podkreśleniem, aby poprawić ich jawne wywoływanie przy przenoszeniu starych aplikacji (bodajże z Delphi 2) do najnowszych wersji, gdzie większość pracy związanej ze zliczaniem odwołań wykonuje za nas kompilator.


Mam nadzieję, że pomogłem :)

Łukasz Brodny

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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