再说一说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 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的时候,要更多的相信自已。。
本文探讨了从VB6升级到VB2008/VB2010过程中遇到的问题,特别是针对RegQueryValueEx函数声明及调用方式的变化进行了详细分析,指出升级向导未能正确处理ByVal参数,可能导致程序行为错误。
1509

被折叠的 条评论
为什么被折叠?



