我正在尝试使用 API 并与此函数进行通信:
BOOL SelectSpeed (int Device, byte SelectSpeed)
SelectSpeed
的参数预计为 0x01 或 0x02 等值。
我已经制作了其他可以正常工作的DLL函数,例如:
function InitDevices(): Integer; stdcall; external 'LightNative.dll';
但是,当我尝试这个
SelectSpeed
函数时,无论我尝试将什么传递到 SelectSpeed
中,我仍然会收到错误。我尝试过Byte
、PByte
、String
、uint8
、integer
等等。
我应该在Delphi中使用什么类型来直接翻译为
Byte
?
function SelectSpeed(Device: integer; SelectSpeed: Byte) : Boolean; stdcall; external 'LightNative.dll';
传入变量示例:
procedure TMainForm.InitializeLight;
begin
InitBlyncDevices();
SelectLightFlashSpeed(0, 1);
end;
使用Delphi的
Byte
是正确的。但您确实需要让返回类型使用 4 字节 LongBool
(例如 Winapi.Windows.BOOL
),而不是 1 字节 Boolean
。
更重要的是,您确定 DLL 函数实际上使用的是
stdcall
而不是 cdecl
? 您所显示的 DLL 函数声明中没有指定调用约定,因此在编译 DLL 时它将依赖于编译器的默认值。 cdecl
是大多数 C 编译器的默认设置,但 stdcall
也是可能的。两者在 C API 中都很常见。 这实际上取决于编译器的配置。
仔细检查 DLL 的
.h
头文件和/或文档。如果没有提及实际使用的调用约定,那么您应该假设 cdecl
除非另有证明。