CのCONTAINING_RECORDマクロは、構造内のフィールドメンバーのアドレスに基づいて、構造/レコード型変数のベースアドレスを返します。コールバックをトリガーするWindowsAPI関数に事前定義されたレコードポインタのみを渡すことができる場合に非常に役立ちます。
たとえば、次のようなタイプがある場合:
type
tInnerRecord = record
x, y : integer;
end;
pInnerRecord = ^tInnerRecord
tOuterRecord = record
field1 : integer;
inner : tInnerRecord;
field2 : integer;
end;
pOuterRecord = ^tOuterRecord;
私は次のようなことができるようになりたいです:
procedure SomeCallback( pIn : pInnerRecord ); stdcall;
var
Out : pOuterRecord;
begin
Out := CONTAINING_RECORD(pIn, tOuterRecord, inner);
Out.field1 := pIn.x + pIn.y;
end;
私の特定のケースでは、コールバックでオブジェクトにアクセスできるように、ReadFileEx(Windows Async I / O)のオーバーラップしたデータポインターと一緒にオブジェクトポインターを渡したいと思います。
Delphi(2006)で同様の機能を提供する同等の機能はありますか?