【发布时间】:2026-01-30 05:05:02
【问题描述】:
C 中的CONTAINING_RECORD macro 根据结构中字段成员的地址返回结构/记录类型变量的基地址。在我只能将预定义的记录指针传递给触发回调的某些 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) 中是否有提供类似功能的等效函数?
【问题讨论】:
-
另一个可以让 Delphi 程序员羡慕的有用的东西是
offsetof用于记录或对象字段。 -
@Serg:有类似的解决方法,例如 LURD 和我的
offsetof解决方案 - 不如宏方便,但它们可以工作。 -
@blerontin:你确定你得到了正确的间接级别吗?
tOuterRecord包含一个指向tInnerRecord的指针,而SomeCallback按值获取pInnerRecord? -
@UliGerhardt:感谢您的提示。我已将
tOuterRecord声明中的inner字段从pInnerRecord更改为tInnerRecord。
标签: delphi pointers struct record