You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Delphi 7或Lazarus中调用landwell.dll函数?

在Delphi 7或Lazarus中调用landwell.dll的方法

我帮你把C#的DLL声明转换成Delphi/Lazarus兼容的语法,同时结合你提供的文档说明,给出具体的调用示例——参数类型严格匹配是DLL调用成功的核心,这部分我已经帮你对应好了。

第一步:DLL函数声明

在Delphi 7或Lazarus的单元里,你可以在interfaceimplementation部分声明这些外部函数,注意使用stdcall调用约定(和C#默认的Winapi调用约定完全一致):

// 通用传输函数PTcomm
function PTcomm(com: Integer; boud: Integer; var Rcount: Integer): Integer; stdcall; external 'landwell.dll';

// 通用传输函数PTcomm_YPWJ(参数结构和PTcomm完全一致)
function PTcomm_YPWJ(com: Integer; boud: Integer; var Rcount: Integer): Integer; stdcall; external 'landwell.dll';

// 通用数据采集函数PTrecord(严格匹配文档要求的8字节数组)
function PTrecord(num: Integer; var record: array[0..7] of Byte): Integer; stdcall; external 'landwell.dll';

类型匹配说明

  • C#的int对应Delphi的Integer(都是32位整数,大小完全一致)
  • C#的ref int对应Delphi的var参数(用于传入传出值,实现双向数据传递)
  • C#的byte[](固定8字节)对应Delphi的array[0..7] of Byte(严格贴合文档中8字节的要求,避免内存越界)

第二步:调用示例

调用PTcomm获取记录总数

var
  ComPort: Integer;
  BaudRate: Integer;
  RecordCount: Integer;
  ResultCode: Integer;
begin
  ComPort := 1; // 串口号对应规则:COM1=1,COM2=2,以此类推
  BaudRate := 9600; // 文档明确波特率固定为9600,无需修改
  ResultCode := PTcomm(ComPort, BaudRate, RecordCount);

  // 根据返回值处理结果
  case ResultCode of
    1: ShowMessage('传输成功,共获取到 ' + IntToStr(RecordCount) + ' 条记录');
    0: ShowMessage('设备中无记录');
    -1: ShowMessage('串口打开失败,请检查端口是否被占用或存在');
    -2: ShowMessage('数据传输失败,请检查设备连接');
  end;
end;

调用PTrecord采集单条记录

var
  SerialNum: Integer;
  RecordData: array[0..7] of Byte;
  ResultCode: Integer;
  I: Integer;
  DataStr: string;
begin
  SerialNum := 1; // 要采集的记录序列号(从1开始,最大为PTcomm返回的Rcount值)
  ResultCode := PTrecord(SerialNum, RecordData);

  if ResultCode = 1 then
  begin
    // 格式化输出8字节数据(包含读卡器编号)
    DataStr := '采集到的8字节数据:';
    for I := 0 to 7 do
      DataStr := DataStr + ' ' + IntToHex(RecordData[I], 2);
    ShowMessage(DataStr);
  end
  else
    ShowMessage('采集记录失败,请检查序列号是否有效');
end;

关键注意事项

  • 确保landwell.dll和你的可执行文件在同一目录,或者放置在系统PATH能找到的路径中
  • Delphi 7仅支持32位程序,因此必须使用32位版本的landwell.dll;Lazarus如果编译32位程序也需要32位DLL,若编译64位则需对应64位DLL(旧版本DLL大概率是32位)
  • 串口号不要填错,比如COM3对应数值3,避免因端口错误导致调用失败
  • PTrecord的数组必须是8字节,使用固定大小数组能有效避免内存越界问题

内容的提问来源于stack exchange,提问作者Jean-Claude

火山引擎 最新活动