Ich brauche eine Klasse implementierende Schnittstelle ohne Referenzzählung. Ich tat folgendes:Casting-Objekt zu Interface-Typ ohne TInterfacedObject als Basisklasse
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;
Fehlende Referenzzählung funktioniert gut. Aber meine Sorge ist, dass ich nicht TMyClass
-IMyInterface
mit as
Betreiber werfen können:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
mir gegeben
[DCC Error] E2015 Operator nicht anwendbar auf diese Operandtyp
Die Problem verschwindet, wenn TMyClass
von TInterfacedObject
abgeleitet wird - dh ich kann ein solches Casting ohne Compilerfehler machen. Offensichtlich möchte ich TInterfacedObject nicht als Basisklasse verwenden, da dies meine Klassenreferenz zählen würde. Warum ist ein solches Casting nicht erlaubt und wie könnte man es umgehen?
Sie könnten bessere Ergebnisse erzielen, wenn Sie Ihrer Schnittstellenkennung eine GUID hinzufügen. Fügen Sie nach der Zeile "= interface" eine neue Zeile hinzu und drücken Sie Strg-Shft-G. 'as',' GetInterface' und 'supports' usw. müssen in der Lage sein, die Schnittstelle nach GUID zu identifizieren, um zu funktionieren. –
Sie haben meine Post nicht sorgfältig gelesen. Wenn ich von TInterfacedObject ableite funktioniert es. GUID hat hier nichts zu tun. Sie benötigen GUID nur, um mit COM zu arbeiten. –
Hmm, welche Delphi Version? –