使用ODBC的VB6程序无法在Win7 64位上运行

3

我有一个旧的VB6程序,使用MySQL 4.07数据库。它在我的Win XP 64位机器上开发,可以在我的Win XP 64位机器上正常运行,在我的Win7 64位机器上也可以正常工作。但是当我们的一个用户尝试在他们的Win7 64位机器上运行它时,它会失败。

    "Run-time error '-2147467259 (80004005)': [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified".  

奇怪的是,他们已经安装了ODBC驱动程序,并将它们放在SysWOW64和system32中。
以下代码在Form_Load中执行,很可能是错误发生的地方(请注意,32位驱动程序适用于NT Server 2.5,而64位驱动程序是更新版本)。
    If IsHost64Bit() = True 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

我已经检查了 SysWOW64 中 odbcad32.exe 的属性,驱动程序选项卡显示用户机器上的 MySQL ODBC 3.51!

如果您有任何想法,将不胜感激。

谢谢, 鲍勃


3
我们有三个VB6遗留应用程序,发现需要使用32位ODBC连接到我们的数据库。 - Mark Kram
马克,你在64位机器上安装了32位ODBC驱动程序吗? - Bob T
您是否需要使用odbcad32.exe为32位用户DSN添加“_32”,并为64位用户DSN添加“_64”? - Bob T
不,我们使用旧版的Wise Installer应用程序来创建MSI,并由MSI为我们创建32位ODBC DSN。 - Mark Kram
1
马克,我终于在我的Win7 64位系统上安装了VB6。我忽略了兼容性警告,目前看来它运行得很好。所以现在我能够逐步执行代码,并发现“IsHost64Bit()”在Win7 64位系统中无法正常工作!因此它从32位加载“mstrConnString”。这就是为什么程序启动时会失败的原因。所以我的新任务是修复“IsHost64Bit()”。感谢您的帮助! - Bob T
干得好!我很高兴能够帮助。 - Mark Kram
2个回答

1
与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

0

首先,下载MySQL ODBC连接器(当前版本)

删除之前的MySQL ODBC连接器

安装新版本并选择所有选项

这对我有效

32位版本也可以在64位机器上运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接