作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
CONTAINING_RECORD macro C 语言根据结构内字段成员的地址返回结构/记录类型变量的基地址。当我只能将预定义的记录指针传递给某些触发回调的 Windows API 函数时,它非常有
例如,在 Winnt.h 中定义了众所周知的 CONTAINING_RECORD() 宏: #define CONTAINING_RECORD(address, type, field) ((type
我是一名优秀的程序员,十分优秀!