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.