sách gpt4 ai đã đi

Tham số API Windows trong Delphi - truyền tham số var có hoặc không có toán tử @?

In lại 作者:可可西里 更新时间:2023-11-01 09:49:33 34 4
mua khóa gpt4 Nike

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

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

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

khác nhau
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 编写的,那么他们为什么要在这些参数上使用 @ 运算符?我错过了什么?

1 Câu trả lời

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

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

34 4 0
可可西里
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com