DLL是VC++写的,没有源码。
别人给了一个VB的例程,如下:
Public Declare Function u_E555_CheckPsw Lib "HTReader.dll" (ComData As COMDATA, ByVal btMode As Byte, ByRef btPsw As Byte) As IntegerCOMDATA的类型定义:
Type COMDATA
    sComPort     As Integer
    sDevID       As Integer
    ucReturn(0 To 23)   As Byte
End TypebtPsw的声明: Dim btPsw(0 to 3) as Byte转成了Delphi代码后是这样:
  Function u_E555_CheckPsw(ComDat: PComData; btMode: integer; btPsw: Pointer): Integer; stdcall; External 'HTReader.dll';COMDATA的定义:
  PComData = ^TCOMDATA;
  TCOMDATA = packed record
    sComPort: short;
    sDevID: short;
    ucReturn: array [0..23] of byte;
  End;btPsw: array [0..3] of byte;在执行给函数的时候也不报错,但就是返回的值不对。一直找不到原因

解决方案 »

  1.   

    Function u_E555_CheckPsw(var ComDat: TComData; btMode: integer; var btPsw: array[0..3] of byte): Integer; stdcall; External 'HTReader.dll';
      

  2.   

    DelphiGuy()  我按你的方法试了,还是不行。 而且 var btPsw: array[0..3] of byte  应该是: var btPsw: array of byte我查资料上说, VB中的 byref 相当于传递指针。
      

  3.   

    问题解决, 罪魁祸首:Integer。VB 中 Integer 是16 位的, Delphi 中是 32位的。把Integer 全部替换为 Smallint 就OK 了。浪费了一天半的时间就因为这么简单的一个原因。唉………………
      

  4.   

    哈哈,,,,,,,,,,,,,,,,,,VB才菜,还停留在16机的水平.
    32位器的INT默认都是4字节,连linux的GCC也是如此
      

  5.   


    回复人:superyys(无血野人) ( 五级(中级)) 信誉:9  2007-01-28 10:29:46  得分:0

    哈哈,,,,,,,,,,,,,,,,,,VB才菜,还停留在16机的水平.
    32位器的INT默认都是4字节,连linux的GCC也是如此
    ================================================VB的三十二位是Long,和Delphi中的Integer相同。