Delphi调用DLL时Byte类型参数适配问题咨询
我正在对接某API,需要调用以下C语言编写的函数:
BOOL SelectSpeed (int Device, byte SelectSpeed)
其中SelectSpeed参数预期传入0x01或0x02这类值。
我已成功调用该DLL中的其他函数,例如:
function InitDevices(): Integer; stdcall; external 'LightNative.dll';
但调用SelectSpeed函数时,无论传入Byte、PByte、String、uint8、integer等哪种类型,都会报错。请问在Delphi中,应使用哪种类型直接对应C语言的Byte?
我当前声明的函数如下:
function SelectSpeed(Device: integer; SelectSpeed: Byte) : Boolean; stdcall; external 'LightNative.dll';
参数传入示例:
procedure TMainForm.InitializeLight; begin InitBlyncDevices(); SelectLightFlashSpeed(0, 1); end;
首先明确:Delphi中的Byte类型就是直接对应C语言的byte(无符号8位整数),你的参数类型声明本身是正确的,但报错大概率来自其他环节,排查方向如下:
函数名称不匹配
你声明的函数是SelectSpeed,但调用时写的是SelectLightFlashSpeed,名称不一致会导致找不到函数入口,这是最可能的错误原因。返回类型不匹配
C语言里的BOOL在Windows平台实际是int类型(4字节),而Delphi的Boolean是1字节的布尔类型。类型不匹配会导致栈平衡错误,建议把返回类型改成LongBool(Delphi中对应4字节的布尔类型,和C的BOOL兼容):function SelectSpeed(Device: Integer; SelectSpeed: Byte): LongBool; stdcall; external 'LightNative.dll';调用约定是否一致
确认C语言的SelectSpeed函数是否真的使用stdcall调用约定。如果C函数是用cdecl编译的,你的Delphi声明也需要改成cdecl,否则会因栈处理方式不同报错。参数取值合法性
确保Device参数的取值符合API要求(比如是否从0开始计数、是否在合法范围),传入的1(对应0x01)是否在SelectSpeed参数的允许值列表内。
内容的提问来源于stack exchange,提问作者user18740004

