VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1033|回复: 3

dll中参数含有结构体,怎么调用

[复制链接]

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-2-16 18:30:01 | 显示全部楼层 |阅读模式
考勤机的动态库调用说明是vb的  

说明:所有函数只接受两个参数  
参数一:Params结构  
参数二:表示硬件类型的数值,  取值[30,  60,  2000,  2100,  2200,  2300,  2600]  

Params结构定义  
Public  Type  Params  
       Port  As  String  *  3                        //串口号,[1~255]  
       CtrlID  As  String  *  3                        //设备号,[1~127]  
       Params  As  String  *  1024            //输入:传递给设备处理的参数表,多参数间以分号分隔,以分号结束  
                                                     //输出:接口返回值  
End  Type  

1。1.            打开串口  
声明  
Public  Declare  Function  OpenComm  Lib  "CM60.dll"  (ByRef  lParam  As  Params,  ByVal  sType  As  Integer)  As  Integer  
调用例子  
dim  p  as  Params  
dim  sType  as  Integer   
dim  ret  as  Long   

sType  =  2100  
p.Port  =  “001”                          ‘打开串口一  
p.CtrlID  =  “001”                            ‘设备号为1  

ret  =  OpenComm(p,  sType)  
select  case  ret   
           case  100            ‘打开失败  
case  105  ‘打开串口成功  
                       case  else  
       end  select   

2。2.            关闭串口  
声明  
Public  Declare  Function  CloseComm  Lib  "CM60.dll"  (ByRef  lParam  As  Params,  ByVal  sType  As  Integer)  As  Integer  
调用例子  
Dim  p  as  Params  
Dim  sType  as  Integer  
Dim  ret  as  Long  

sType=2100  
p.Port=”001”        ‘关闭串口一  
p.CtrlID=””          ‘设备号忽略  

ret=CloseComm(p,sType)  
select  case  ret  
           case  100    ‘关闭串口一失败  
           case  105    ‘关闭串口一成功  
           case  else  
end  select  


请问1,2两个示例在delphi中如何调用?
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-4-19 10:15:01 | 显示全部楼层
//结构类型声明
type
  TParams = Record
    Port: String[3]
    CtrlID: String[3]                        //设备号,[1~127]
    Params: String[1024]
  end
//函数声明
function OpenComm(var lParam: Params, sType: Integer): Integer; external CM60.dll name 'OpenComm';
function CloseComm(var lParam: Params, sType: Integer): Integer; external CM60.dll name 'CloseComm';

//调用:
var
  p: TParams;
  sType, ret: Integer;
begin
  sType := 2100;
  p.Port := '001';
  p.CtrlID := '001';
  ret := OpenComm(p, sType);
  case ret of
    100: ShowMessage('打开失败');
    105: ShowMessage('打开串口成功');
  end;
  p.Port := '001';
  p.CtrlID := '';
  ret := CloseComm(p, sType);
  case ret of
    100: ShowMessage('失败');
    105: ShowMessage('成功');
  end;
end;
回复

使用道具 举报

0

主题

14

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-4-28 19:00:01 | 显示全部楼层
来晚了,帮顶
回复

使用道具 举报

4

主题

12

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
 楼主| 发表于 2020-4-28 21:15:02 | 显示全部楼层
谢谢,调用成功,但不知道为什么调不到串口,总是返回100

unit Ukq;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TParams = Record
    Port: String[3];
    CtrlID: String[3];                        //设备号,[1~127]
    Params: string[250];
  end ;

var
  Form1: TForm1;


implementation

{$R *.dfm}
function OpenComm(var lParam:tParams;sType:Integer): Integer;stdcall; external 'CM60.dll' ;
function CloseComm(var lParam:tParams;sType:Integer): Integer;stdcall; external 'CM60.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  p: TParams;
  sType, ret: Integer;
begin
  sType := 2100;
  p.Port :=edit1.text;
  p.CtrlID :=edit2.Text;
  ret := OpenComm(p, sType);
    showmessage(inttostr(ret));


  ret := CloseComm(p, sType);
   p.CtrlID :='';
    showmessage(inttostr(ret));

end;
end.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表