以下是同一个API函数的C和VB的声明:
__int16 __stdcall asc_hex(unsigned char *asc, unsigned char *hex);
Declare Function asc_hex Lib "mwic_32.dll" (ByVal asc as string, ByRef hex As Byte) As Integer为什么
__int16 __stdcall asc_hex(unsigned char *asc, unsigned char *hex);中的两个参数
同样的unsigned char *asc, unsigned char *hex  却分别对应  VB中的  ByVal asc as string, ByRef hex As Byte这是为什么。

解决方案 »

  1.   

    API函数的参数声明是可以采用的不同方式,尤其是涉及字符串时,但是你要明白他的道理,懂得不同声明的不同调用方法
      

  2.   

    __int16 __stdcall asc_hex(unsigned char *asc, unsigned char *hex);仅仅看上面C函数原型就可以知道:第一个参数是无符号ASCII字符型指针(地址),就可以声明成VB的Long,调用时传入asc的地址;第二个参数是无符号十六进制字符型指针(地址),就可以声明成VB的Byte类型,传入字节地址。第一个参数如果声明成Long,要这样传入:varptr(asc)。
      

  3.   

    需要注意的是:通过__stdcall声明的DLL,VB可以调用;通过__cdecl声明的DLL,VB不能调用。
      

  4.   

    本质上都是一样,指向字节缓冲区的指针,所以声明也可以一样,但调用就要麻烦点.不同的声明只是为了使用上方便,不易出错.API声明无非就是为了方便调用者以及限制调用者.如果使用者不需要这些限制,完全可以把任意API的参数全都声明为byval xxxx as long,代价是调用的时候完全要由自己去保证参数的类型以及正确性,比如什么时候该传值,什么时候该专指针.一旦搞错,就出错了.
      

  5.   

    老马说的没错在vb里面声明的时候,你尽可把参数设置成 as long,或者直接 as any,vb系统不坚持数据类型,你自己来保证,错了不要埋怨系统,呵呵。有的时候API函数用的是多个结构的指针,在VB里面就麻烦,不如用个byref  as any,或者是as long的省事。
      

  6.   

    看看这本书,有关于这方面的介绍:
    http://download.csdn.net/source/3050780
      

  7.   

    C和VB在数据类型的强弱上有差异,所以两个不同用途的参数,在 C 中只能声明为相同的类型,而在 VB 中就可以区分了。