迷惑:以ByVal的形式将String str传给一个API,执行完毕后,str获得新值,请问str的值为什么能改变呢?

解决方案 »

  1.   

    在调用api时,对于字符串类型的你必须以byval类型传递
    就相当于传递地址,因为VB字符串变量其实是SAFEARRAY
      

  2.   

    是否改变,并不是由你调用的时候怎么写(ByVal or ByRef)来决定的,而是写API的时候决定的。如果API函数本身就是写成ByRef方式,即使你在声明的时候使用ByVal,也是不起作用的。
      

  3.   

    API不受你按什么方式(地址,传值)的影响.
    在VB中自定义函数可以.
      

  4.   

    我好像说错了
    ByVal是“按值”调用,参数传递时,不将指向DLL的指针传递给参数变量本身,而是将传递参数值的一份拷贝传递给DLL。比如传递字符串参数时,VB与DLL之间的接口支持两种类型的字符串,如未使用ByVal关键字,VB将指向DLL的函数指针传递给一个OLE2.0字符串(即BSTR数据类型),而Windows API函数往往不支持这种数据类型,导致错误。而使用ByVal关键字后VB将字符串转变换成C语言格式的“空终止”串,被API正确使用。
      

  5.   

    你传的是地址,在API函数中,将该地址原来的值改变了。
      

  6.   

    VB中的字符串以C的眼光来看是指向指针的指针,所以Byval传递过去的实际是真实字符串内容所在的地址的指针(如果是ByRef的话传递的就是指向这个指针的指针)。直到指针当然就能修改其指向的地址的内容了。