Interfejs powodujący błędy pamięci

Odpowiedz Nowy wątek
2011-09-05 12:22
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.

edytowany 1x, ostatnio: Juhas, 2011-09-05 12:35

Pozostało 580 znaków

2011-09-05 13:57
0

czym jest FPMAppInterface?

Pozostało 580 znaków

2011-09-05 15:34
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... TInterfacedObject i Runtime 204


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 1x, ostatnio: payl, 2011-09-05 15:34

Pozostało 580 znaków

2011-09-08 14:37
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.

Pozostało 580 znaków

2011-09-08 14:52
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ś).


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 1x, ostatnio: payl, 2011-09-08 14:52
Pokaż pozostałe 5 komentarzy
racja, zbieżność nazwy narzędzia i stosu wywołań mnie zmyliła :-) - ŁF 2011-09-16 00:45
Ja bym raczej stawiał że Twoja potrzeba atakowania mnie nakłoniła Ciebię do atakowania mnie w moim starym poście na dodatek bez wyraźnego powodu. Chciałbym się mylić :-] - payl 2011-09-16 14:57
to nie potrzeba atakowania. od wczoraj zwyczajnie i serdecznie cię nie lubię. - ŁF 2011-09-16 15:45
Gdybyś mnie nie lubił, to byś się ze mną nie zadawał :-[ . A Ty mnie atakujesz. Widzisz różnicę? No to super. - payl 2011-09-16 15:56
ciekawa umiejętność, odpowiadanie samemu sobie na pytania. i to retoryczne... nie, nie jestem masochistą, nie lubię cię i to uczucie się pogłębia w szybkim tempie, w dodatku po twoim chamskim w moim odczuciu komentarzu straciłem do ciebie cały szacunek; jednak muszę umieć zadawać się z różnymi typami ludzi, wiec żyj sobie szczęśliwie. - ŁF 2011-09-16 18:00

Pozostało 580 znaków

2011-09-08 20:00
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.

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