gpt4 book ai didi

delphi - Delphi 中 CONTAINING_RECORD C 宏的等效函数是什么?

转载 作者:行者123 更新时间:2023-12-03 15:09:16 28 4
gpt4 key购买 nike

CONTAINING_RECORD macro C 语言根据结构内字段成员的地址返回结构/记录类型变量的基地址。当我只能将预定义的记录指针传递给某些触发回调的 Windows API 函数时,它非常有用。

例如,如果我有一些类型,例如:

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 异步 I/O)的重叠数据指针一起传递,以便我可以在回调中访问该对象。

Delphi (2006) 中是否存在提供类似功能的等效函数?

最佳答案

我现在编译器已经用完了,但这应该可以解决问题:

Out := Pointer( Cardinal(pIn) - Cardinal(@TOuterRecord(nil^).inner));
<小时/>

David 解释了为什么 Delphi 中没有直接等效的函数。所以这是一个最接近的函数:

function ContainingRecord( var aField; aFieldOffsetRef : Pointer) : Pointer;
{$IF Declared(NativeUInt) = False}
type
NativeUInt = Cardinal;
{$IFEND}
begin
Result := Pointer(NativeUInt(@aField) - NativeUInt(aFieldOffsetRef));
end;

调用示例:

Out := ContainingRecord(pIn^, @pOuterRecord(nil).inner);

关于delphi - Delphi 中 CONTAINING_RECORD C 宏的等效函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14776370/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com