*是指针,应该使用ByRef修饰Public Declare Function GetMac Lib "d:\btoc\sldes.dll" (ByRef buf As Byte, ByVal buf_len As Long, ByVal MacKey As String, ByVal mac As String) As LongPublic Declare Function ConvertPwd Lib "sldes.dll" (ByRef Source As Byte, ByRef dest As Byte, ByRef workkwy As Byte, ByVal flag As Byte) As Long

解决方案 »

  1.   

    对于char*、LPSTR……
    有三种情况
    一、字符串,那定义为ByVal …… as String
    二、单字节数据,ByRef …… As Byte
    三、数据缓冲区:有三种声明方式:
        ByRef …… as Byte:Byte数据流,调用:Bytes数组(最小下标)
        ByVal …… As Long:直接设置地址(注:用VarPtr可以得到变量的地址)
        …… As Any:最灵活的形式你的MacKey、mac具体是什么数据?
    数据长度?
      

  2.   

    1、Public Declare Function GetMac Lib "d:\btoc\sldes.dll" (ByVal buf As string, ByVal buf_len As Long, ByVal MacKey As String, ByVal mac As String) As Long
    2、Public Declare Function ConvertPwd Lib "sldes.dll" (ByVal Source As string, ByVal dest As Byte, ByVal workkwy As Byte, ByVal flag As Byte) As Long指针参数可以byval,这样系统将把地址指针赋给字符串或数组变量。
    记住,VB中只有字符串或数组变量是通过指针引用的。
      

  3.   

    Public Declare Function ApiGetMac Lib "xxx.dll" Alias "GetMac" (ByRef bytAryBuf As Byte, ByVal bytAryLen As Long, _
                                ByRef bytAryMacKey As Byte, ByRef bytAryMac As Byte) As LongPublic Declare Function ApiConvertPwd Lib "xxx.dll" Alias "ConvertPwd" (ByRef bytArySource As Byte, ByRef bytAryDest As Byte, _
                                ByRef bytAryKey As Byte, ByVal bytFlg As Byte) As Long
    在调用时遇到bytAry...开头的变量时用Byte型的数组,传递参数时用数组的第一个元素即可。
      

  4.   

    数据缓冲区绝对不能ByVal …… as StringVB的自动ANSI->UniCode那会破坏一切的
      

  5.   

    假设我得到的数据源为:
      长度为422位的包文(字符串),经过加密的
      除去Mac长度为16位和Track(磁道信息)160位外剩下244位
    起先我得使用函数:(把整个包文解密)
      GetMac(数据源,数据源长度=244,得到的Mac密钥值,生成的Mac包文);
    再在生成的Mac包文中取出16位经过Des加密后的密文用函数:(把包文中的密码一项解密)
      ConvertPwd(16位密码,解密后的数据(明码),从上面函数中得的Mac密钥值,"d");
    在这里我碰到这样的问题:
    我的数据源得来应该是字符串(VB中的string),生成的244位Mac包文也应该是字符串,这样我才能用mid(Mac包文,160,16)取出16位密码,再解密得到明码也是字符串。
    现在定义成byte型,本人还有点搞不懂,所以还请各位能否说明一下上面我说的过程。
    dim sourStr() as byte
    dim mackey() as byte
    dim objeStr() as byte
    dim errsucc as longerrsucc=GetMac(sourStr,244,mackey,objeStr)'是这样吗?
    那我怎么取244位的数据的几位呢???
      

  6.   

    是这样:
    你的VC++函数最好有一对(字符vs十六进制字符串)转换函数,你来回传递的都是“08BF9312”之类的串。当然这样串长度会增加一倍,但是避开了Unicode问题。
    否则,你必须使用byte数组,用传址方式。
    在VB中调用时,引用数组的首单元。
    这两种方式我都用过。目前我用的dll库两种都有。
      

  7.   

    现在我写成这样:
    Public Declare Function GetMac Lib "sldes.dll" (ByRef buf As Byte, ByVal buf_len As Long, ByRef mackey As Byte, ByRef mac As Byte) As Long
    在调用时写成这样???:
    dim strfrom(2) as byte
    dim sourStr(2) as byte
    dim mackey(2) as byte
    dim objeStr(2) as byte
    dim errsucc as longwinsock1.getdata strfrom(0)
    errsucc=GetMac(strfrom(0),244,mackey(0),objestr(0))???
      

  8.   

    现在又碰到说:找不到DLL入口点 GetMac in sldes.dll!!!
    这又是为什么啊??