问问 如果有一个API原形中
有一个参数 该参数被声明为AS ANY类型
那是不是在调用时对该参数的传值
必须加上BYVAL吗(默认为BYREF)
至少我做了几个实验是这样
比如
'================================
'VB声明 (向注册表里写值)
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long 
rc = RegSetValueEx(keyh, KeyValueName, 0, dtype, ByVal value, Len(value))  '--乱码
rc = RegSetValueEx(keyh, KeyValueName, 0, dtype, value, Len(value)) '--正常
为什么会这样啊
VALUE是"111"
dtype 我选择的是REG_SZ的
注册表中是什么字符啊

解决方案 »

  1.   

    如果是字符串的话这样声明.
    Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal szData As String, ByVal cbData As Long) As Long
      

  2.   

    如果你对byval和 byref比较迷惑,可以看看下面的内容:在C语言中,只有按值传递参数的方式,没有Byref方式,byref是VB特有的。(因为C中有指针,不需要Byref)。所以API只能接受按值传递的参数,在VB中声明的API函数,如果出现了byval,那么和API是完全兼容的,意义也是相同的。在VB中声明的API函数,如果出现了byref,其意义和
    VB内部函数的Byref不代表同一个意义。(其实如果你用过回调,就会发现,这句话并不准确,其实是同意义的。应该说:在VB中声明的API函数,如果出现了byref,其实和VB内部函数的Byref比较起来,是个“做了一半”的Byref,只有取地址按值传递的过程,而在外部DLL中没有按地址还原别名的过程。VB内部函数的Byref传参是个完整的过程,不但包括取地址按值传递的过程,被调用者还做了把地址还原为别名变量的的过程。而回调的时候,如果出现了byref,是个“只做了后一半”的Byref,即是把地址还原为别名变量的的过程。)
      

  3.   

    VB 的API调用默认是使用传送地址方式,就是byref方式。声明为ANY类型只是告诉编译器放弃类型检测而已,和传什么参数没有关系。
      

  4.   

    楼上说得好!本人学到的是:在应用中,尽量根据具体情况把 any 定义改成特定类型,减少出错风险。
      

  5.   

    用byva还是byref,与AS ANY没有必然联系,具体情况具体分析。
      

  6.   

    关于any类型,还请看看这里举的例子:
    http://community.csdn.net/Expert/topic/3992/3992063.xml?temp=.3965876