参照カウントを持たないクラスを実装するクラスが必要です。私は次のようでした:参照カウントの基本型としてTInterfacedObjectを持たないインターフェイス型にオブジェクトをキャスト
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;
欠如は、正常に動作します。私は
[DCCのエラー] E2015演算子このオペランドのタイプには適用されません
与えられています
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
:しかし、私の懸念は、私がas
演算子を使用してIMyInterface
にTMyClass
をキャストすることができないということですTMyClass
がTInterfacedObject
から派生したときに問題が解消しました。つまり、コンパイラエラーなしでこのようなキャストを実行できます。明らかに、TInterfacedObjectをベースクラスとして使用したくないので、クラス参照をカウントします。なぜこのようなキャスティングは禁止されているのですか?
インターフェイス宣言にGUIDを追加すると、より良い結果が得られる場合があります。 '= interface'行の後ろに新しい行を追加し、Ctrl-Shft-Gを押します。 'as'、' GetInterface'や 'supports'などは、動作するためにGUIDによってインタフェースを識別できる必要があります。 –
あなたは自分の投稿を慎重に読まなかった。私はTInterfacedObjectから派生したときに動作します。 GUIDはここでは何もしません。 COMで操作するには、GUIDが必要です。 –
ええと、どのDelphiのバージョン? –