gpt4 book ai didi

Delphi 中的 Windows API 参数 - 使用或不使用 @ 运算符传递 var 参数?

转载 作者:可可西里 更新时间:2023-11-01 09:49:33 33 4
gpt4 key购买 nike

我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:

SetupDiGetDeviceRegistryProperty(
DevInfoHandle,
DeviceInfoData,
RegProperty,
@PropertyRegDataType,
nil,
0,
@RequiredSize
);

我在参数@PropertyRegDataType 和@RequiredSize 上收到错误“实际参数和形式参数的类型必须相同”。声明了这些参数:

var
RequiredSize: Cardinal;
PropertyRegDataType: DWORD;

MSDN 将这些参数描述为:“RequiredSize [out, optional] 一个指向 DWORD 类型变量的指针,该变量接收 PropertyBuffer 缓冲区所需的大小(以字节为单位),该缓冲区需要保存请求的数据属性。此参数是可选的,可以为 NULL。"和 "PropertyRegDataType [输出,可选] 指向变量的指针,该变量接收正在检索的属性的数据类型。这是其中之一标准注册表数据类型。此参数是可选的,可以为 NULL。”

SetupDiGetDeviceRegistryProperty 的声明(在 JVCL 的 SetupAPI.pas 中)如下所示:

function SetupDiGetDeviceRegistryProperty(
DeviceInfoSet: HDEVINFO;
const DeviceInfoData: TSPDevInfoData;
Property_: DWORD;
var PropertyRegDataType: DWORD;
PropertyBuffer: PBYTE;
PropertyBufferSize: DWORD;
var RequiredSize: DWORD
): BOOL; stdcall; {$EXTERNALSYM SetupDiGetDeviceRegistryProperty}

由于 PropertyRegDataType 和 RequiredSize 是 var 参数,它们应该能够在没有 @ 运算符的情况下传递。事实上,如果我从函数调用参数中删除 @ 运算符,代码会编译,但会因访问冲突(读取地址 0)而崩溃。 original code是为 Delphi 7 编写的,那么他们为什么要在这些参数上使用 @ 运算符?我错过了什么?

最佳答案

Delphi 通过varout 关键字支持“引用参数”,并且在某些API 转换中,类似C 的指针可能会被这种约定所取代;这些参数是强制性的,必须按原样传递,没有地址运算符 @
如果参数声明保留为指针,允许您传递 nil,您必须确保参数是可选的 - 或者 - 将其设置为适当大小的有效内存位置通过 @ 运算符; 在这种情况下不执行类型检查

关于Delphi 中的 Windows API 参数 - 使用或不使用 @ 运算符传递 var 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5004854/

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