与Mark Kram的讨论促使我尝试在Win7 64位计算机上安装VB6。在安装过程中,我忽略了兼容性警告。据我所知,它已经安装并正常工作。因此,我能够逐步执行代码,并发现“IsHost64Bit()”在Win7 64位上无法正常工作!“IsHost64Bit()”例程表明64位计算机是32位的!因此,它从32位加载“mstrConnString”。这就是程序启动时失败的原因。
“IsHost64Bit()”需要:
Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" _
Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function IsWow64Process Lib "kernel32" _
(ByVal hProc As Long, ByRef bWow64Process As Boolean) As Long
“IsHost64Bit()”例程:
Public Function IsHost64Bit() As Boolean
Dim handle As Long
Dim is64Bit As Boolean
' Assume initially that this is not a WOW64 process
is64Bit = False
' Then try to prove that wrong by attempting to load the
' IsWow64Process function dynamically
handle = GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process")
' The function exists, so call it
If handle <> 0 Then
IsWow64Process GetCurrentProcess(), is64Bit
End If
' Return the value
IsHost64Bit = is64Bit
End Function
我用以下代码替换了“IsHost64Bit()”:
Dim wmi, prc
Dim prcOS As String
Set wmi = GetObject("winmgmts:\\")
For Each prc In wmi.execQuery("SELECT * FROM Win32_Processor")
Debug.Print prc.Name, "Bit Sizes - ADDR:"; prc.AddressWidth, "DATA:"; prc.DataWidth
prcOS = Str(prc.DataWidth)
Next
现在,Form_Load例程正确地检查64位,如下所示:
If prcOS = " 64" Then
mstrConnString = "driver=MySQL ODBC 3.51 Driver;server=mysqleng;database=engprogs;port=3306;UID=user;PWD=########"
Else
mstrConnString = "driver=MySQL;server=mysqleng;database=engprogs;port=3306;UID=user;PWD=########"
End If
Set ADOCn = New ADODB.Connection
ADOCn.ConnectionString = mstrConnString
ADOCn.Open mstrConnString