dephi:
function Read_Guest_Card(
AReaderType,
ACardType,
APort,
ASector,
ABlock:Byte;
AHotelPwd:Pchar;
var ALockNo,
AStartSuite,
AEndSuite,
ACardID,
ASubCardID:integer;
ATime:Pchar
):integer; stdcall; External DLL_Name;vb:
Public Declare Function Adx_Read_Guest_Card Lib "dll_name.dll" Alias "Read_Guest_Card" (ByVal AReaderType As Byte, ByVal ACardType As Byte, ByVal APort As Byte, ByVal ASector As Byte, ByVal ABlock As Byte, ByVal AHotelPwd As String, ByVal ALockNo As Long, ByVal AStartSuite As Byte, ByVal AEndSuite As Byte, ByVal ACardID As Long, ByVal ASubCardID As Long, ByVal ATime As String) As Bytevb调用 Dim ALockNo As Byte
Dim AStartSuite As Byte
Dim AEndSuite As Byte
Dim ACardID As Integer
Dim ASubCardID As Integer
Dim ATime As String * 11
Dim iRet As Byte
AdxLockType=1
AdxCardType=1
ComPort=1
HotelCode = "12345678"
iRet = Adx_Read_Guest_Card(AdxLockType, AdxCardType, ComPort, IIf(AdxCardType = 1, 3, 5), 0, HotelCode, ALockNo, AStartSuite, AEndSuite, ACardID, ASubCardID, ATime)执行这个函数的时候直接崩毁掉了
function Read_Guest_Card(
AReaderType,
ACardType,
APort,
ASector,
ABlock:Byte;
AHotelPwd:Pchar;
var ALockNo,
AStartSuite,
AEndSuite,
ACardID,
ASubCardID:integer;
ATime:Pchar
):integer; stdcall; External DLL_Name;vb:
Public Declare Function Adx_Read_Guest_Card Lib "dll_name.dll" Alias "Read_Guest_Card" (ByVal AReaderType As Byte, ByVal ACardType As Byte, ByVal APort As Byte, ByVal ASector As Byte, ByVal ABlock As Byte, ByVal AHotelPwd As String, ByVal ALockNo As Long, ByVal AStartSuite As Byte, ByVal AEndSuite As Byte, ByVal ACardID As Long, ByVal ASubCardID As Long, ByVal ATime As String) As Bytevb调用 Dim ALockNo As Byte
Dim AStartSuite As Byte
Dim AEndSuite As Byte
Dim ACardID As Integer
Dim ASubCardID As Integer
Dim ATime As String * 11
Dim iRet As Byte
AdxLockType=1
AdxCardType=1
ComPort=1
HotelCode = "12345678"
iRet = Adx_Read_Guest_Card(AdxLockType, AdxCardType, ComPort, IIf(AdxCardType = 1, 3, 5), 0, HotelCode, ALockNo, AStartSuite, AEndSuite, ACardID, ASubCardID, ATime)执行这个函数的时候直接崩毁掉了
问题还是要修改你的函数声明。
tmpTime:string;
HotelPwd:array[0..8] of char;
rt,LockNo,CardID,SubCardID,StartSuite, EndSuite:integer;
LockNo:=0;
CardID:=0;
SubCardID:=0;
StartSuite:=0;
EndSuite:=0;
GetMem(Time,11);
StrPCopy(HotelPwd, Edit2.Text);
rt:=Read_Guest_Card(FReaderType,FCardType, FPortNo,FSector,FBlock,@HotelPwd,
LockNo,StartSuite,EndSuite,CardID,SubCardID,Time);
ByVal ASubCardID As Long
function Read_Guest_Card(...):integer
Function Adx_Read_Guest_Ca(...) As Byte
好神奇的 Delphi integer 类型,会变化长度的?
BYTE Read_Guest_Card( BYTE AReaderType, BYTE ACardType, BYTE APort, BYTE ASector, BYTE ABlock, BYTE * AHotelPwd,int ALockNo, BYTE AStartSuite, BYTE AEndSuite, int ACardID, int ASubCardID, char * ATime )我只有个dll文件和调用说明,具体他的dll怎么写的不得而知。造成崩溃的地方我觉得就是BYTE * AHotelPwd,其他我都直接用数值传过,就是这样:
iRet = Adx_Read_Guest_Card(1, 1, 1, 1, 1, "12345678", ALockNo, AStartSuite, AEndSuite, ACardID, ASubCardID, ATime)
没有崩溃,提示溢出
这些清楚了在写vb的声明.我的最垃圾解决办法就是:dephi不是调用没问题嘛,在调试器里面定位到dephi调用的位置,看看进入堆栈的参数,都是些什么,是指针,还是数值,字符串是什么格式
tmpTime:string;
HotelPwd:array[0..8] of char;
rt,LockNo,CardID,SubCardID,StartSuite, EndSuite:integer;
LockNo:=0;
CardID:=0;
SubCardID:=0;
StartSuite:=0;
EndSuite:=0;
GetMem(Time,11);
StrPCopy(HotelPwd, Edit2.Text);
rt:=Read_Guest_Card(FReaderType,FCardType, FPortNo,FSector,FBlock,@HotelPwd,
LockNo,StartSuite,EndSuite,CardID,SubCardID,Time);
Dim HotelCode(8) As Byte
For i = 0 To 7
HotelCode(i) = asc(Mid(AdxHotelCode, i + 1, 1))
Next i
HotelCode(8) = 0 Dim iRet As Byte
iRet = Adx_Read_Guest_Card(AdxLockType, AdxCardType, ComPort, IIf(AdxCardType = 1, 3, 5), 0, VarPtr(HotelCode(0)), ALockNo, AStartSuite, AEndSuite, ACardID, ASubCardID, ATime)
http://115.com/file/dnrpuki2#接口.rarvb老鸟帮下忙,晕了.就是读卡的时候崩溃,delphi没问题,vb调用不行
我坚持认为是你的函数在VB中的声明有问题
'声明
Public Declare Function Adx_Read_Guest_Card Lib "ADXLock10.dll" Alias "Read_Guest_Card" (ByVal AReaderType As Byte, ByVal ACardType As Byte, ByVal APort As Byte, ByVal ASector As Byte, ByVal ABlock As Byte, ByVal AHotelPwd As Long, ByVal ALockNo As Long, ByVal AStartSuite As Byte, ByVal AEndSuite As Byte, ByVal ACardID As Long, ByVal ASubCardID As Long, ByVal ATime As String) As Byte
'调用
Dim ALockNo As Byte
Dim AStartSuite As Byte
Dim AEndSuite As Byte
Dim ACardID As Integer
Dim ASubCardID As Integer
Dim ATime As String * 11
Dim HotelCode(8) As Byte
AdxLockType=1
AdxCardType=1
ComPort=1
For i = 0 To 7
HotelCode(i) = asc(Mid(AdxHotelCode, i + 1, 1))
Next i
HotelCode(8) = 0
Dim iRet As Byte
iRet = Adx_Read_Guest_Card(AdxLockType, AdxCardType, ComPort, IIf(AdxCardType = 1, 3, 5), 0, VarPtr(HotelCode(0)), ALockNo, AStartSuite, AEndSuite, ACardID, ASubCardID, ATime)
Delphi代码
'声明
DLL_Name = 'ADXLock10.dll' ; // 读客人卡
function Read_Guest_Card(
AReaderType,
ACardType,
APort,
ASector,
ABlock:Byte;
AHotelPwd:Pchar;
var ALockNo,
AStartSuite,
AEndSuite,
ACardID,
ASubCardID:integer;
ATime:Pchar
):integer; stdcall; External DLL_Name;
'调用
Time:pchar;
tmpTime:string;
HotelPwd:array[0..8] of char;
rt,LockNo,CardID,SubCardID,StartSuite, EndSuite:integer;
LockNo:=0;
CardID:=0;
SubCardID:=0;
StartSuite:=0;
EndSuite:=0;
GetMem(Time,11);
StrPCopy(HotelPwd, Edit2.Text);
rt:=Read_Guest_Card(FReaderType,FCardType, FPortNo,FSector,FBlock,@HotelPwd,
LockNo,StartSuite,EndSuite,CardID,SubCardID,Time);
AReaderType,
ACardType,
APort,
ASector,
ABlock:Byte;
AHotelPwd:Pchar;
var ALockNo,
AStartSuite,
AEndSuite,
ACardID,
ASubCardID:integer;
ATime:Pchar
):integer; stdcall; External DLL_Name;
'注意:以下语句中的注释仅供参考,不符合VB语法,必须删除。
Public Declare Function Adx_Read_Guest_Card Lib "ADXLock10.dll" Alias "Read_Guest_Card" ( _
ByVal AReaderType As Byte, _
ByVal ACardType As Byte, _
ByVal APort As Byte, _
ByVal ASector As Byte, _
ByVal ABlock As Byte, _
ByVal AHotelPwd As Long, _
ByRef ALockNo As Long, _ 'Delphi 中的 var 参数应该是按地址传递
ByVal AStartSuite As Long, _ 'Delphi 中的 integer 应该是 Int32
ByVal AEndSuite As Long, _ 'Delphi 中的 integer 应该是 Int32
ByVal ACardID As Long, _
ByVal ASubCardID As Long, _
ByVal ATime As String _
) As Long 'Delphi 中的 integer 应该是 Int32
Public Declare Function Adx_Read_Guest_Card Lib "ADXLock10.dll" Alias "Read_Guest_Card" ( _
ByVal AReaderType As Byte, _
ByVal ACardType As Byte, _
ByVal APort As Byte, _
ByVal ASector As Byte, _
ByVal ABlock As Byte, _
ByVal AHotelPwd As Long, _
ByRef ALockNo As Long, _ 'Delphi 中的 var 参数应该是按地址传递
ByRef AStartSuite As Long, _ 'Delphi 中的 integer 应该是 Int32
ByRef AEndSuite As Long, _ 'Delphi 中的 integer 应该是 Int32
ByRef ACardID As Long, _
ByRef ASubCardID As Long, _
ByVal ATime As String _
) As Long 'Delphi 中的 integer 应该是 Int32