Delphi XE2には、実行時にインターフェイスの実装を作成するための新しいTVirtualInterfaceがあります。残念ながら、私はXE2を使用していません。古いバージョンのDelphiでは、この種の処理にどのような種類のハッカーが関係しているのでしょうか?Delphiでは、インターフェイスを実装していないオブジェクトにインターフェイスをバインドすることが可能です
IMyInterface = interface
['{8A827997-0058-4756-B02D-8DCDD32B7607}']
procedure Go;
end;
それは、コンパイラの助けを借りずに、実行時にこのインターフェースにバインドすることは可能です:
は、私は、次のインタフェースを持っているとしましょうか?
TMyClass = class(TObject, IInterface)
public
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
procedure Go; //I want to dynamically bind IMyInterface.Go here
end;
私は、単純なハードキャストしようとしました:
var MyInterface: IMyInterface;
begin
MyInterface := IMyInterface(TMyClass.Create);
end;
をコンパイラはこれを防ぐことができます。
は、その後、私はas
キャストを試してみましたが、それは、少なくともコンパイル:
MyInterface := TMyClass.Create as IMyInterface;
だから私は鍵がQueryInterface
が照会されているインタフェースの実装に有効なポインタを返してもらうことであると想像します。実行時にどのように構築するのですか?
私はSystem.pasを通して掘り下げましたので、少なくともGetInterface
、GetInterfaceEntry
、およびInvokeImplGetter
がどのように機能するのかよく知っています。 (ありがたいことにEmbacaderoは最適化されたアセンブリと一緒にパスカルソースを残すことにしました)。私はそれを正しく読んでいないかもしれませんが、0のオフセットを持つインタフェースエントリが存在する可能性があります。この場合、InvokeImplGetter
を使用してインタフェースを割り当てる別の手段があります。
私の究極の目標は、リフレクションをサポートしている言語で利用可能なダイナミックプロキシとモックの能力の一部をシミュレートすることです。インターフェイスと同じメソッド名とシグネチャを持つオブジェクトに正常にバインドできれば、大きな第一歩になります。これも可能ですか、間違った木を鳴らしていますか?
あなたがこれを行うために必要がある場合は、XE2は、移動するための方法です。 TVirtualInterfaceを使うと簡単にドロップダウンします。それはそのクラスなしで苦痛と闘いになるでしょう。 DelphiMocksプロジェクトでその試みが行われています:http://bit.ly/o9GJVW –
私が成功すれば、私はDelphiMocksに貢献することを計画していました。 –
多分[この質問](http://stackoverflow.com/questions/662875/virtual-library-interfaces-for-delphi-win32)は面白いです。 –