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)执行这个函数的时候直接崩毁掉了

解决方案 »

  1.   

    几乎可以肯定是你都函数声明有问题导致了内存读写错误, 所以程序崩溃。这是DLL函数运用不当的典型问题。
    问题还是要修改你的函数声明。
      

  2.   

    动态库是别人的,delphi调用正常,但是vb崩溃,刚才没说清
      

  3.   

    delphi调用dll代码  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);
      

  4.   

    把要传递的参数合并为1~3个参数,在DLL调用时,在去分解它。
      

  5.   

    有没有DLL的原型?问题的关键还是DLL的声明。
      

  6.   

    ASubCardID:integer
    ByVal ASubCardID As Long
    function Read_Guest_Card(...):integer
    Function Adx_Read_Guest_Ca(...) As Byte
    好神奇的 Delphi integer 类型,会变化长度的?
      

  7.   

    C的定义,没有stdcall,不知道是不是搞错了
    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)
    没有崩溃,提示溢出
      

  8.   

    dephi和C有什么不同?比如数据类型,指针,字符串...
    这些清楚了在写vb的声明.我的最垃圾解决办法就是:dephi不是调用没问题嘛,在调试器里面定位到dephi调用的位置,看看进入堆栈的参数,都是些什么,是指针,还是数值,字符串是什么格式
      

  9.   

    这个是delphi的调用  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);
      

  10.   

    字符串数组就和C传递的差不多了,在vb里传递要byval传递字符串数组首字母地址.还有就是delphi的字符串数组的结束,C的字符串数组是靠末尾的0说明字符串结束的,delphi的字符串是...
      

  11.   

    这样调用了一下,加了个VarPtr(),不崩溃了,但是提示溢出
        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)
      

  12.   

    哪位帮忙看下delphi调用源码,我上传到网盘了,我都崩溃了
    http://115.com/file/dnrpuki2#接口.rarvb老鸟帮下忙,晕了.就是读卡的时候崩溃,delphi没问题,vb调用不行
      

  13.   

    把你的VB代码发上来看看?
    我坚持认为是你的函数在VB中的声明有问题
      

  14.   

    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);
      

  15.   

      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 "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
      

  16.   

    关于 integer 的错误我在7楼已经指出过了!
      

  17.   

    解决了,多谢vb老鸟,var必须全部转换成byref
    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