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

Posted

技术标签:

【中文标题】使用 ODBC 的 VB6 程序在 Win7 64 下无法运行【英文标题】:VB6 program using ODBC will not run in Win7 64 【发布时间】:2012-09-21 16:15:26 【问题描述】:

我有一个使用 mysql 4.07 数据库的旧 VB6 程序。它是在我的 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!

任何想法将不胜感激。

谢谢, 鲍勃

【问题讨论】:

我们有三个旧版 VB6 应用程序,我们发现需要使用 32 位 ODBC 连接到我们的数据库。 马克,你在 64 位机器上安装了 32 位 ODBC 驱动程序吗? 您是否必须使用 odbcad32.exe 将“_32”添加到 32 位用户 DSN 和“_64”到 64 位用户 DSN? 不,我们使用较旧的 Wise Installer 应用程序来创建 MSI,而 MSI 为我们创建 32 ODBC DSN。 马克,我终于在我的 Win7 64 上安装了 VB6。我忽略了兼容性警告,据我所知它运行良好。所以现在我能够单步执行代码并发现“IsHost64Bit()”在 Win7 64 中无法正常工作!因此,它从 32 位加载“mstrConnString”。这就是程序启动时失败的原因。所以我的新任务是修复“IsHost64Bit()”。感谢您的帮助! 【参考方案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

【讨论】:

【参考方案2】:

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

删除您以前的 MySQL ODBC 连接器

使用所有选项安装新版本

这对我有用

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

【讨论】:

以上是关于使用 ODBC 的 VB6 程序在 Win7 64 下无法运行的主要内容,如果未能解决你的问题,请参考以下文章

关于Win7 64位系统通过ODBC访问Access的一点经验

电脑是win7 64位,运行vb6.0的出现:“部件'mscomctl.ocx'或其部件之一不能注册:一个文件丢失或无效”

win7 64位 直接安装mysql odbc 64位 报错1918,怎么解决?

使用SSAS+Power BI如何正确配置ODBC

在我的电脑里不知啥时候多扯了一个ODBC(32位),我的电脑是win7(64位)的,求大侠怎样卸载ODBC

VB6.0编写的程序在win7或win8上可以用吗