原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 lpValueName As String, 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, strValName, 0, lngType, 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

看来升级向导没有我们想像的智能,所以我们在升级Code的时候,要更多的相信自已。。