原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

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