现在碰到一个很奇怪的问题: 有个c++build编写的dll文件,有个参数为buffer:(unsigned char*) 类型,大小为64个字节,
1.在vb中我将它定义成byte,报xxxx地址不能write,但是硬件数据已经正确返回来了
2.如果定义成string ,不报错,但是将字符一个个转化成十六进制数时,数据不对。
  在delphi中定义字符正确返回为:
   嘃%k4?'#0'F?'#$17'YPH'#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#
   0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0''#7'€i
  但是在vb中为:
    嘃%k4? F?YPH                                      €i
 前面几个数据好象接收不对啊????   如何解决啊???   

解决方案 »

  1.   

    用String接收后再赋值给Byte数组
    dim buff() as Byte
    dim str as Stringbuff = str
    ...
      

  2.   

    我认为没有错
    好像是Dephi中把“看不见的”字符放在单引号里输出了,#后面的就是ASCII码吧?
    用VB的String当然只能看到可见字符,看不见的字符都当成空格输出了
      

  3.   

    先看看API申明是否正确
    buffer:(unsigned char*) 
    如果采用Byte数组,则
    用 Byref btBuf() as Byte做参数.  注意关键字是Byref
    如果采用String,则
    调用后将String转换成Byte数组,转换方式用For循环.比如:
    For i=1  to len(StrBuf)
        btBuf(i-1)=cbyte(asc(mid(strBuf,i,1)))
    next
      

  4.   

    TO:MoQi_123(老莫的春天) 
      
     For i=1  to len(StrBuf)
        btBuf(i-1)=cbyte(asc(mid(strBuf,i,1)))
      next取出strbuf后,当i才等于1就报错:"溢出”错误啊
      

  5.   

    建议采用 byref btBuf()做参数, 申明的时候(btBuf() as byte).其实byref可以省略的vb默认就是byref传递如果用string传递,这样写
    不报错才怪, 你看看 asc(mid(strbuf,i,1))是不是大于255了,大于肯定报错, 注意len,mid,asc,都是按unicode来取的,字符级操作,你可以用b版本的字节操作, 更改如下
    redim btBuf(lenb(strBuf)-1) as byte
    for i=1 to lenb(strbuf)
        btBuf(i-1) = ascb(midb(strbuf,i,1))
    next i
    这个cbyte是多余的, ascb返回本来就是byte型
      

  6.   

    补充下,asc(mid(strbuf,i,1))大于255了的原因是, 在你原dll本来这个buf就不是用做char的, 比如硬件数据buf,就可能这样,而vb傻傻的2个字节当unicode解码,,然后返回双字节给你,当然大于255, mid("pigsanddogs",1,1)小于255, 是因为"p"的unicode高字节本来就是0的兼容ascii码
      

  7.   

    TO : pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
     你的也报错啊
      

  8.   

    Dim strbuf As String
    Dim btbuf() As Byte
    strbuf = "嘃%k4? F?YPH                                      €i"
    For i = 1 To LenB(strbuf)
        btbuf(i - 1) = AscB(MidB(strbuf, i, 1))
    Next i 
    ///  TO : pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
     你的也报错啊
      

  9.   

    还有一个问题是,将参数定义成byref  buffer() as  byte  
    dim buffer(63) as byte 程序运行到此函数调用后报
    某某地址不能读.
      

  10.   

    Dim strbuf As String
    Dim btbuf() As Byte
    Redim btbuf(LenB(strbuf)-1) as Byte           '// <------ u should add this line
    strbuf = "嘃%k4? F?YPH                                      €i"
    For i = 1 To LenB(strbuf)
        btbuf(i - 1) = AscB(MidB(strbuf, i, 1))
    Next i 
    ///  TO : pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
     你的也报错啊呵呵你里面少写了句。  在for 前面没有redim btbuf(lenb(strbuf)-1) as byte 你看看前面某某地址不可读? 你把你程序帖出来好吗?