书到用时方恨少!一个简单的vb调用dll函数申明问题,改成delphi的,在线,解决马上给分。
函数申明部分:
Attribute VB_Name = "HMS_57"
Declare Function PortOpen_Temic Lib "T5557.DLL" (ByVal port As Integer, ByVal baud As Long) As Long
Declare Function PortClose_Temic Lib "T5557.DLL" (ByVal icdev As Long) As Integer
Declare Function Test_Temic Lib "T5557.DLL" () As Integer
Declare Function Init_Temic Lib "T5557.DLL" (ByVal port As Integer) As Long
Declare Function Beep_Temic Lib "T5557.DLL" (ByVal icdev As Long) As Integer
Declare Function PortOpen_IC Lib "T5557.DLL" (ByVal port As Integer) As Long
Declare Function PortClose_IC Lib "T5557.DLL" (ByVal icdev As Long) As Integer
Declare Function Guest_Card_57 Lib "T5557.DLL" (ByVal icdev As Long, ByVal RD_Add As Integer, ByRef Authorization_Code As Byte, ByRef CardID As Byte, ByRef Room1 As Byte, ByRef Room2 As Byte, ByRef Room3 As Byte, ByRef Start_Time As Byte, ByRef End_Time As Byte) As Integer
Declare Function Guest_Card_IC Lib "T5557.DLL" (ByVal icdev As Long, ByRef Authorization_Code As Byte, ByRef CardID As Byte, ByRef Room1 As Byte, ByRef Room2 As Byte, ByRef Room3 As Byte, ByRef Start_Time As Byte, ByRef End_Time As Byte) As Integer
Declare Function Read_Authorization_Code_57 Lib "T5557.DLL" (ByVal icdev As Long, ByVal RD_Add As Integer, ByRef Authorization_Code As Byte) As Integer
Declare Function Read_Authorization_Code_IC Lib "T5557.DLL" (ByVal icdev As Long, ByRef Authorization_Code As Byte) As Integer
Declare Function CardData_57 Lib "T5557.DLL" (ByVal icdev As Long, ByVal RD_Add As Integer, ByRef Authorization_Code As Byte, ByRef CardID As Byte, ByRef CardType As Byte) As Integer
Declare Function CardData_IC Lib "T5557.DLL" (ByVal icdev As Long, ByRef Authorization_Code As Byte, ByRef CardID As Byte, ByRef CardType As Byte) As Integer
Declare Function CardCode Lib "T5557.DLL" (ByRef CARD_CODE As Byte) As Integer
Declare Function Clear_Card_57 Lib "T5557.DLL" (ByVal icdev As Long, ByVal RD_Add As Integer) As Integer
Declare Function Clear_Card_IC Lib "T5557.DLL" (ByVal icdev As Long) As Integer
Global commdev As Long
Global OK_Num As Long
Global Not_OK_Num As Long
Global Totel As Long
其中一按钮事件:
Private Sub Command27_Click()
Dim st As Long
Dim AUTH_CODE(8) As Byte
Dim Start_Time(5) As Byte
Dim End_Time(5) As Byte
Dim RD_Add As Integer
Dim Room1(6) As Byte
Dim Room2(6) As Byte
Dim Room3(6) As Byte
Dim CARD_CODE(8) As Byte
Dim CardID As Double
Dim Temp1 As Double
Dim Temp2 As Double
RD_Add = Val(Text9.Text) And &HFF
st = CardCode(CARD_CODE(0))
Temp1 = CARD_CODE(0)
Temp2 = &H1000000
CardID = Temp1 * Temp2
Temp1 = CARD_CODE(1)
Temp2 = &H10000
CardID = CardID + Temp1 * Temp2
Temp1 = CARD_CODE(2)
Temp2 = &H100
CardID = CardID + Temp1 * Temp2
CardID = CardID + CARD_CODE(3)
If Len(Text16.Text) < 16 Then Exit Sub
AUTH_CODE(0) = Val("&H" & Mid(Text16.Text, 1, 2))
AUTH_CODE(1) = Val("&H" & Mid(Text16.Text, 3, 2))
AUTH_CODE(2) = Val("&H" & Mid(Text16.Text, 5, 2))
AUTH_CODE(3) = Val("&H" & Mid(Text16.Text, 7, 2))
AUTH_CODE(4) = Val("&H" & Mid(Text16.Text, 9, 2))
AUTH_CODE(5) = Val("&H" & Mid(Text16.Text, 11, 2))
AUTH_CODE(6) = Val("&H" & Mid(Text16.Text, 13, 2))
AUTH_CODE(7) = Val("&H" & Mid(Text16.Text, 15, 2))
Start_Time(0) = Right(Year(Now), 2)
Start_Time(1) = Month(Now)
Start_Time(2) = Day(Now)
Start_Time(3) = Hour(Now)
Start_Time(4) = Minute(Now)
End_Time(0) = Right(Year(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss")), 2)
End_Time(1) = Month(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
End_Time(2) = Day(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
End_Time(3) = Hour(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
End_Time(4) = Minute(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
If Text18.Text = "" Then
MsgBox "请输入楼栋编号(0---15)!"
Exit Sub
End If
Room1(0) = Val(Text18.Text) And &HF
If Text19.Text = "" Then
MsgBox "请输入朝向编号(0---15)!"
Exit Sub
End If
Room1(1) = Val(Text19.Text) And &HF
If Text20.Text = "" Then
MsgBox "请输入楼层编号(0---255)!"
Exit Sub
End If
Room1(2) = Val(Text20.Text) And &HFF
If Text21.Text = "" Then
MsgBox "请输入房号(0---255)!"
Exit Sub
End If
Room1(3) = Val(Text21.Text) And &HFF
If Text22.Text = "" Then
MsgBox "请输入套间编号(0---15)!"
Exit Sub
End If
Room1(4) = Val(Text22.Text) And &HF
If Text23.Text = "" Then
MsgBox "请输入公共区编号(0---15)!"
Exit Sub
End If
Room1(5) = Val(Text23.Text) And &HF
Room2(0) = Room1(0)
Room2(1) = Room1(1)
Room2(2) = Room1(2)
Room2(3) = Room1(3)
Room2(4) = Room1(4)
Room2(5) = Room1(5)
Room3(0) = Room1(0)
Room3(1) = Room1(1)
Room3(2) = Room1(2)
Room3(3) = Room1(3)
Room3(4) = Room1(4)
Room3(5) = Room1(5)
Select Case Combo2.Text
Case "T5557"
st = Guest_Card_57(commdev, RD_Add, AUTH_CODE(0), CARD_CODE(0), Room1(0), Room2(0), Room3(0), Start_Time(0), End_Time(0))
Select Case st
Case 0
List1.AddItem "宾客卡写成功!"
Case 1
List1.AddItem "宾客卡写失败!"
Case 2
List1.AddItem "宾客卡写失败!"
Case 3
List1.AddItem "宾客卡写失败!"
Case 4
List1.AddItem "宾客卡写失败!"
Case 5
List1.AddItem "卡片没有格式化!"
End Select
Case "IC4442"
st = Guest_Card_IC(commdev, AUTH_CODE(0), CARD_CODE(0), Room1(0), Room2(0), Room3(0), Start_Time(0), End_Time(0))
Select Case st
Case 0
st = dv_beep(commdev, 10)
List1.AddItem "宾客卡写成功!"
Case 1
List1.AddItem "宾客卡写失败!"
Case 2
List1.AddItem "宾客卡写失败!"
Case 3
List1.AddItem "宾客卡写失败!"
Case 4
List1.AddItem "宾客卡写失败!"
Case 5
List1.AddItem "卡片没有格式化!"
End Select
End Select
End Sub
能把它改称delphi的吗?
有点长,不过估计看得懂的也没什么,都是些重复的,呵呵,谢谢啦。
问题点数:100、回复次数:14Top
1 楼yesin163(破网)回复于 2006-06-04 13:02:52 得分 0
函数申明部分请给出一个例子就行了。谢谢
Top
2 楼liangqingzhi(老之)回复于 2006-06-04 13:15:01 得分 20
function PortOpen_Temic(var port: Integer; var baud: LongInt): LongInt; external 'T5557.DLL';Top
3 楼yesin163(破网)回复于 2006-06-04 14:02:01 得分 0
大侠,那个按钮执行的代码能不能解释一下,我不知道在delphi中如何写。。。Top
4 楼happyggy(Delphi<-&&->java)回复于 2006-06-04 17:46:15 得分 50
读写IC卡命令是16进制的
Top
5 楼jadeluo(秀峰)回复于 2006-06-04 18:00:23 得分 30
Declare Function PortOpen_Temic Lib "T5557.DLL" (ByVal port As Integer, ByVal baud As Long) As Long
VB中的Integer是16位的, Long为32位, 所以改写为Delphi就要写成:
function PortOpen_Temic(port: ShortInt; baud: LongInt): LongInt; stdcall; external 'T5557.DLL';
Top
6 楼afeng124(我是峰儿谁是沙)回复于 2006-06-04 18:29:55 得分 0
楼上的说的有道理。Top
7 楼yesin163(破网)回复于 2006-06-05 09:04:59 得分 0
Dim Start_Time(5) As Byte
Dim End_Time(5) As Byte
是定义数组吗?
其实那么多语句只为这句服务:
Guest_Card_57(commdev, RD_Add, AUTH_CODE(0), CARD_CODE(0), Room1(0), Room2(0), Room3(0), Start_Time(0), End_Time(0))
那么
Start_Time(0) = Right(Year(Now), 2)
Start_Time(1) = Month(Now)
Start_Time(2) = Day(Now)
Start_Time(3) = Hour(Now)
Start_Time(4) = Minute(Now)
End_Time(0) = Right(Year(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss")), 2)
End_Time(1) = Month(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
End_Time(2) = Day(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
End_Time(3) = Hour(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
End_Time(4) = Minute(Format(Text26.Text, "yyyy-mm-dd hh:mm:ss"))
Start_Time的1/2/3/4和End_Time1/2/3/4算出来有什么意义呢??
请指点一下,这是个写RFID卡的函数,我想肯定的把开始时间和结束时间详细到秒写入卡内
但函数中只用到Start_Time(0),End_Time(0),有点不合理哦。请指点。
Top
8 楼happyggy(Delphi<-&&->java)回复于 2006-06-05 09:32:38 得分 0
VB:
Dim Start_Time(5) As Byte
Dim End_Time(5) As Byte
Delphi:
var
Start_Time: array[0..4] of Byte
End_Time: array[0..4] of Byte
写RFID卡好像要分块写入数据,
根据你说得意思好像还应改有,
Guest_Card_57(commdev, RD_Add, AUTH_CODE(1), CARD_CODE(0), Room1(1), Room2(1), Room3(1), Start_Time(1), End_Time(1))....
Top
9 楼yesin163(破网)回复于 2006-06-05 09:32:53 得分 0
还有这些:
Room2(0) = Room1(0)
Room2(1) = Room1(1)
Room2(2) = Room1(2)
Room2(3) = Room1(3)
Room2(4) = Room1(4)
Room2(5) = Room1(5)
Room3(0) = Room1(0)
Room3(1) = Room1(1)
Room3(2) = Room1(2)
Room3(3) = Room1(3)
Room3(4) = Room1(4)
Room3(5) = Room1(5)
直接用Room1不就好了吗??不知道是否例有用意呢?谢谢Top
10 楼yesin163(破网)回复于 2006-06-05 09:40:15 得分 0
to happyggy(为爱情放弃事业?):
没有了,整个写卡的vb的代码就在这上面啊,我的意思是不是vb里面 Start_Time(0)是不是代表整个Start_Time数组?不然就不好解释了,只把年份写到卡里是没有意义的呀。
这是个门禁卡,客人可凭系统发的卡限时进入,比如Start_Time,end_Time来限制进入时间和出门时间,在此时间外的此卡就失效。Top
11 楼happyggy(Delphi<-&&->java)回复于 2006-06-05 10:58:30 得分 0
yesin163(破网) ,
可能是这样,
Guest_Card_57(commdev, RD_Add, AUTH_CODE(0), CARD_CODE(0), Room1(0), Room2(0), Room3(0), Start_Time(0), End_Time(0))
这个函数传递的是数组的地址,当作为地址传递时,Start_Time(0)就代表整个数组了吧Top
12 楼yesin163(破网)回复于 2006-06-05 11:26:50 得分 0
哦,呵呵,这个样子的话在delphi中写Start_Time[0], End_Time[0]也应该是可以的了?
哎,他们这个东西也作的太潦草了,没dll的函数说明,很难的有函数传递过去是传地址的
传完整时间过去不是很好嘛,呵呵,我得去客户那里尝试看看
Top
13 楼yesin163(破网)回复于 2006-06-05 11:27:44 得分 0
不知道有没其他的说法,搞定后结帖,谢谢啊Top
14 楼yesin163(破网)回复于 2006-06-06 21:46:41 得分 0
function PortOpen_Temic(var port: Integer; var baud: LongInt): LongInt; external 'T5557.DLL';
ByRef ByVal
问题解决了,不过最终还是自己动手弄半天才搞定的,发现比较奇怪的问题
如楼上几位大哥说的函数定义部分都有问题,
比如Declare Function PortOpen_Temic Lib "T5557.DLL" (ByVal port As Integer, ByVal baud As Long) As Long
函数最终写法
Function PortOpen_Temic(port:Word, baud :LongWord):LongWord;STDCALL; external 'T5557.DLL';
才达到目的,否则要么函数执行没响应,要么干脆就是调处内存地址读写错误
呵呵.
结贴罗....
Top




