关于酒店门锁接口缺少DELPHI调用问题(100)

H

hncsym

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的,要跟酒管软件做一个门锁接口,酒管软件是用DELPHI开发,可是提供的接口示例里面只有VB和PB的,没有DELPHI语言的接口,根据说明把接口转换成DELPHI语言的调用,但程序执行后一直报错。DELPHI调用接口声明如下: function opencomm(com:integer):integer; stdcall;external 'larkdll.dll'; function closecomm():integer; stdcall;external 'larkdll.dll'; function deletecard(a7:pchar):integer;external 'larkdll.dll'; function makecard(a1,a2,a3,a4,a5,a6,a7:pchar):integer; external 'larkdll.dll'; function readcard(buffer:pchar;a7:pchar):integer; external 'larkdll.dll';VB中声明如下:Declare Function opencomm Lib "larkdll.dll" (ByVal port%) As Integer '串口选择Declare Function closecomm Lib "larkdll.dll" () As Integer '关闭串口Declare Function deletecard Lib "larkdll.dll" (ByVal buffer$) As Integer '退卡Declare Function makecard Lib "larkdll.dll" (ByVal buffer1$, ByVal buffer2$, ByVal buffer3$, ByVal buffer4$, ByVal buffer5$, ByVal buffer6$, ByVal buffer7$) As Integer '写卡Declare Function readcard Lib "larkdll.dll" (ByVal buffer1$, ByVal buffer2$) As Integer '读卡我们现在把问题简化下,在DELPHI语言下只测试打开串口和关闭串口以及退客人卡这三个调用,其中打开串口和关闭串口正常,但是退客人卡调用一直报错,调用接口如下:procedure TForm1.Button4Click(Sender: TObject);var ret:integer;begin ret:=deletecard(pchar(trim(Edit1.Text)));//传入的是接口注册码 if ret<>0 then begin application.MessageBox(pchar('销卡失败!'),pchar(application.Title),0); end else begin application.MessageBox(pchar('销卡成功!'),Pchar(application.Title),0); end;end;哪位能够提供点建议,万分感谢!
 
少了stdcall吧
 
把错误粘上来,看上去没问题
 
Windows 32 Bit Dll Help V3.01一.版权说明 Larkdll.dll函数与本公司门锁管理软件配套发行,不属于免费提供技术服务。所有使用DLL公司必须经过本公司授权。非法拷贝使用所带来的后果本公司概不负责。二.函数定义function integer opencomm( integer com) library "larkdll.dll"function integer closecomm() library "larkdll.dll"function integer deletecard(string a7) library "larkdll.dll" alias for "deletecard;Ansi"function integer makecard(string a1,string a2,string a3,string a4,string a5,string a6,string a7) library "larkdll.dll" alias for "makecard;Ansi"function integer readcard(ref string buffer,string a7) library "larkdll.dll" alias for readcard;Ansi"三.函数说明1.opencomm(com:integer):integer;说明:打开通讯设备调用:com:integer 串口号,整数0:表示串口1,1:表示串口2。返回:<>0 错误 =0 正确2. closecomm():integer说明:关闭通讯设备调用:返回:<>0 错误 =0 通讯设备正常关闭3. makecard(a1,a2,a3,a4,a5,a6,a7):integer;说明:制宾客卡调用: a1:string 4位或6位 房间锁的物理号,门锁管理软件御出(sfcroom.txt,sfcroom.dbf,sfcroom.xls,      普通房间长度为4,子房间长度为6)。 a2:string 12位   开始时间, 格式为yyyymmddhhmm a3:string 12位   结束时间, 格式为yyyymmddhhmm a4:string 2位    反锁标志位 01 为能开反锁 00 为不能开反锁 a5:string 2位    卡号为01至99 a6:string 6位  卡系列号 0x000000至0xFFFFFF 每张卡唯一标志,可顺序加1 a7:string 11位     注册号注:1:因为本公司的房号是加密的,所以在取房号时要先运行 sfcroom.exe  把房号对应表导出来。  2:卡号就是同一个房间,能同时打开房间的序号。即第一张为 01 第二张为 02 等。  3:开反锁:跟据酒店的规矩,客人卡能不开反锁,就是房间反锁了,客人卡能否开门。  4:结束时间必须大于开始时间,但不超过365天。 5: 卡系列号为6位十六进制的数,表示每张卡的ID号,所以每做一张卡卡系列号都不能相同。    以上限制规则必须严格遵守,在调用函数前请作好各种效验。在DLL函数中不作效验,    否则即使显示制卡成功 也可能存在不能正常开门。返回:0: 制卡正确 1: 非57卡 2: 未加密卡 3,4,8:AOR错误 100,101:注册号错误 4.readcard(buffer:pchar,a7:pchar):integer; 说明:读宾客卡调用: buffer:pchar 读出数据的缓冲区(70字符,一定要申请分配空间)返回:0:读卡正确, 显示的信息buffer的内容依次为:卡号,反锁标志位,房间号(6位),开始时间,结束时间,卡系列号   用“;”分开。 <>0读卡错误   a7:pchar 注册号5.deletecard(a7:pchar):integer; 说明:退宾客卡,把客人卡的数据清空。返回:0:读卡正确, a7:pchar 注册号四:操作流程  1:先安装调试好酒店的所有门锁都能正常开门。备份相应的数据库文件。  2:运行 sfcroom.exe ,会生成三个文件sfcroom.txt,sfcroom.dbf,sfcroom.xls,    内面有房号和加密房号的一一对应表。如:301   AABB,表示301房的加密房号为    AABB,所以在做301房的客人卡时在房号栏为 AABB,在读301房号卡时要显示为301,    不能显示 AABB 给操作人员。  3:在做接口时要最少要做好以下操作:    A:建一个内面有房号和加密房号的对应表。    B:建一个做客人卡的表,保存做卡信息。    C:建一个操作纪录的表,保存操作纪录。  4:如何做二张卡能同时开一个门:    在做第二张卡时要从 3中 表B 中提取第一张卡的开始时间作为这张卡的开始时间,其它信息    按实际情况填写。    五:客人卡不能开门作如下检查:  1:房号相同。  2:客人卡是有效的。       在门锁系统中有四个时间,           一:门锁主板上有二个时间:             1:锁内当前时间=A。             2:客人卡的开始有效时间=B。           二:客人卡上有二个时间:              1: 开始时间=C               2: 结束时间=D             只有满足:  B <= C <= A <= D  客人卡就能开门。         各个时间的变化是:C 和 D 是做客人卡时确定的。         A 是在门锁初始化时读“时间卡”时确定的,           并且 A 会在锁体中与标准时间一样变化走动。 可以认为是实时标准时间。              B 是在门锁初始化时,初始成“2000年1月1号0点0分0秒”。    以后每读到一个新的客人卡时,客人卡开门时, 会比较“客人卡”的开始时间,若客人卡的    开始时间晚于B ,则会把新的客人卡的开始时间代替 B 。    所以在接口中一定要注意四个时间和它们的变化,    并且酒管接口与本公司的锁管软件不能同时使用做客人卡。    做出来的卡会互相干扰,因为所做的客人卡的开始时间会不一致的而导致开不了门。  3:本系统是新卡取代旧卡,即:客人的开始时间在后的开门后,客人的开始时间在前的就不能开门。  4:所有用户接口函数的注册号是专用的。
 
上面是厂家发过来的对dll文件调用的说明
 
先检查调用约定,再检查指针参数,在C中pchar指的是字节型指针,而在delphi的不同版本中pchar有的是字节型指针,有的是双字节指针。还有C中的string类型是以‘/0’结尾的字符型数组,在delphi中要在自己加'/0'。
 
function deletecard(a7:pchar):integer;stdcall;external 'larkdll.dll';
 
大家好,问题解决了,是自己粗心,少了个stdcall,感谢大家,结贴了
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
979
import
I
I
回复
0
查看
749
import
I
顶部