Interfejs powodujący błędy pamięci

0

Mam intrfejs zdefiniowany tak:

type
  TPMMData = array[0..8] of byte;

type
  IPMAppInterface = interface(IInterface) [PMAppInterfaceGUID]

    procedure PluginManMsg(Msg: integer; Data: TPMMData); stdcall;
end;

i klasę, która go implementuje:

type
  TPMAppInterface = class(TInterfacedObject, IPMAppInterface)

  public
    procedure PluginManMsg(Msg: Integer; Data: TPMMData); stdcall;
end;

Chodzi o to, że metoda może zostać wywołana z DLL i wtedy aplikacja musi coś zrobić:

  FPMAppInterface:=TPMAppInterface.Create;
  res:=getTemplate(FPMAppInterface, Application.Handle, nieistotne_parametry);
  FPMAppInterface:=nil; //bez tego dzieje się to samo

getTemplate to funkcja z DLL. Potem w aplikacji mam pętle, gdzie przy przypisaniu pewnej zmiennej dostaję Access Violation, invalid pointer itd.

Ostatnio zmieniłem sposób obsługi interfejsu tak:

  FPMAppInterface:=TPMAppInterface.Create;
  res:=getTemplate(FPMAppInterface, Application.Handle, nieistotne_parametry);

  while FPMAppInterface.RefCount>1 do FPMAppInterface._Release;

  FPMAppInterface:=nil; //bez tego dzieje się to samo

I działało. Do dzisiaj, gdzie znowu dostaję błędy gdzieś tam niżej podczas przypisywania(chyba, że zamiast 1 wpiszę 0, to błąd dostaję w tej pętli while, gdy RefCount = 1)

Jestem pewien, że to kwestia interfejsu, ponieważ gdy zakomentowałem te linie z nim związane, wszystko było ok.
Nie wiem, czy to normalne, ale po getTemplate interfejs ma 20 referencji.

Ktoś ma jakiś pomysł?

[dopisane]
Wywaliłem ten interfejs i przekazuję po prostu w parametrze odpowiednią procedurę. Jest dobrze, niemniej jednak chciałbym się dowiedzieć, czemu tak z tym interfejsem się dzieje.

0

czym jest FPMAppInterface?

0

Jestem pewien, że to kwestia interfejsu, ponieważ gdy zakomentowałem te linie z nim związane, wszystko było ok.
Nie wiem, czy to normalne, ale po getTemplate interfejs ma 20 referencji.

Tak pobijecie mnie, ale jak na mój gust te referencje nie powinny być na chama wywalane przez _Release (które nie powinno być wykonywane).

Może looknij na mój wątek... http://4programmers.net/Forum/Delphi_Pascal/180818-tinterfacedobject_i_runtime_204?start=0

0
Azarien napisał(a)

czym jest FPMAppInterface?

To obiekt TPMAppInterface, który implementuje ten interfejs.
Jeśli chodzi o _Release - jasne. Ale bez tego ciągle były błędy. Z tym tylko czasami.

0

Jeśli chodzi o _Release - jasne. Ale bez tego ciągle były błędy. Z tym tylko czasami.

Mniejsze zuo?!?! Błąd to błąd, skoro wywala się, to widać coś Ci usiłuje powiedzieć. Możesz podać call stack i nazwę tego błędu? I czy przeczytałeś mój wątek? Bo tam jest napisane jak mniejwięcej powinno się używać interfejsów (których zapewnie źle używasz). No, i jak możesz to daj więcej kodu (albo lepiej opisz ten który już daleś).

0

To obiekt TPMAppInterface, który implementuje ten interfejs.

no to już mamy przyczynę: należy używać zmiennej typu interfejsowego, a wywoływać konstruktor klasy:

var FPMAppInterface : IPMAppInterface;
...
FPMAppInterface := TPMAppInterface.Create();

jeśli dobrze zrobisz, to nie trzeba żadnych Release.

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