再说一说VB6到VB2008/VB2010升级向导的问题:
原VB6代码:
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long,ByVal lpValueName As String,ByVal lpReserved As Long,lpType As Long, lpData As String,lpcbData As Long) As Long
'后面的引用中,代码
'Detected DataType(lngType) &Data Length(lngcbData)
lngResult = RegQueryValueEx(lngHandle,strValName,0&,lngType, ByVal strRet,lngcbData)
升级为VB2008/2010后:
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA"(ByVal hKey As Integer,ByVal lpReserved As Integer,ByRef lpType As Integer,ByRef lpData As String,ByRef lpcbData As Integer) As Integer
'后面引用中的代码:
'Detected DataType(lngType) & Data Length(lngcbData)
lngResult = RegQueryValueEx(lngHandle, strRet,lngcbData)
由升级可结可以看到,原VB6的声明语句中的lpData As String升级为:ByRef lpData As String,ByRef为VB的缺省传值方式。
这里,并没有错。
但是 VB6后面引用中的 ByVal strRet,升级到为:strRet,直接忽视了ByVal而使用了ByRef的方式。
如此,一个需要ByVal传递的值StrRet变成了ByRef传递。
这样,造成的后果,不言而喻。
究其原因是:向导在将声明语句中的lpData As String升级为:ByRef lpData As String的时候,并没有参考后面的引用方式ByVal strRet