Potrzebuję interfejsu implementującego klasę bez liczenia odwołań. Wykonałem następujące czynności:Przesyłanie obiektu do typu interfejsu bez TInterfacedObject jako klasy podstawowej
IMyInterface = interface(IInterface)
['{B84904DF-9E8A-46E0-98E4-498BF03C2819}']
procedure InterfaceMethod;
end;
TMyClass = class(TObject, IMyInterface)
protected
function _AddRef: Integer;stdcall;
function _Release: Integer;stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
public
procedure InterfaceMethod;
end;
procedure TMyClass.InterfaceMethod;
begin
ShowMessage('The Method');
end;
function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TMyClass._AddRef: Integer;
begin
Result := -1;
end;
function TMyClass._Release: Integer;
begin
Result := -1;
end;
Brak liczenia odwołań działa dobrze. Ale moim problemem jest to, że nie mogę rzucić TMyClass
do IMyInterface
użyciu as
operatora:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
jestem daną
[DCC Error] E2015 Operator nie dotyczy tego typu argumentu
problem znika, gdy TMyClass
wywodzi się z - tzn. mogę wykonywać takie casting bez błędu kompilatora. Oczywiście nie chcę używać TInterfacedObject jako klasy bazowej, ponieważ spowodowałoby to zliczenie odwołania do klasy. Dlaczego takie odrzucanie jest niedozwolone i jak można go obejść?
Możesz mieć lepsze wyniki, dodając identyfikator GUID do deklaracji interfejsu. Dodaj nową linię po linii '= interface' i naciśnij Ctrl-Shft-G. 'as',' GetInterface' i 'supports' etc muszą być w stanie zidentyfikować interfejs GUID do pracy. –
Nie przeczytałeś dokładnie mojego wpisu. kiedy wywodzę się z TInterfacedObject, działa. GUID nie ma tu nic do roboty. Potrzebujesz GUID tylko do pracy z COM. –
Hmm, która wersja Delphi? –