odbcjt32.dll 的真实路径是啥,System32 或 SysWOW64 检查它的参数

Posted

技术标签:

【中文标题】odbcjt32.dll 的真实路径是啥,System32 或 SysWOW64 检查它的参数【英文标题】:What is the odbcjt32.dll real path, System32 or SysWOW64 to check it's parametersodbcjt32.dll 的真实路径是什么,System32 或 SysWOW64 检查它的参数 【发布时间】:2019-11-24 08:04:36 【问题描述】:

我正在尝试通过注册表以编程方式创建 ODBC 连接。

在使用 Windows ODBC 工具时,我注意到对于 ODBC 32,“Microsoft Access Driver (*.mdb)”正在使用 odbcjt32.dll,并且注册表中的条目将指向此位置:

"Driver"="C:\\Windows\\system32\\odbcjt32.dll"

但是当我搜索该文件时,它存在,但位于其他文件夹中:

C:\Windows\SysWOW64

我需要知道原因,因为:

我需要从 C# 创建连接,我想我应该像 ODBC 工具一样将条目放到 C:\Windows\system32 我想从 C# 检查这个 DLL 版本,所以我应该检查 C:\Windows\SysWOW64\odbcjt32.dll ??

这个 DLL 在 Windows 中有一个神奇的重定向吗?

感谢您的澄清,

【问题讨论】:

【参考方案1】:

有关 SysWoW64 和 system32 的一些背景信息,请参阅 the super user question "System32 and SysWOW64 on Windows 7"。所以是的,Windows 上有一个针对 32 位和 64 位 DLL 的“魔术重定向”。

C:\Windows\SysWOW64 中的文件 odbcjt32.dll 是 32 位版本。对于 32 位程序,路径 C:\Windows\system32\ 被重定向到 C:\Windows\SysWOW64\。您的程序当前的解决方案平台是什么? x86、x64 或任何 CPU?我觉得应该是 x86 才能使用 32 位驱动。

看看Environment.GetFolderPath 方法和Environment.SpecialFolder.SystemX86 这样你就不需要硬编码路径了。

有关魔术重定向的其他信息

要查看 DLL 的位数,您可以使用 dumpbin。我在下面的示例中使用“odbc32.dll”。打开你的Visual Studio版本的Developer Command Prompt,执行如下命令:

dumpbin /headers c:\windows\syswow64\odbc32.dll

输出将包含以下行:

FILE HEADER VALUES
             14C machine (x86)

现在为system32目录下的DLL执行dumpbin:

dumpbin /headers c:\windows\system32\odbc32.dll

哪个输出

FILE HEADER VALUES
            8664 machine (x64)

如您所见,机器上有同一个 DLL 的 x64(“64 位”)和 x86(“32 位”)版本。 Windows 会根据正在运行的程序的位数进行魔术重定向。 64 位程序从 C:\Windows\system32 获取 DLL,32 位程序从 C:\Windows\SysWoW64 获取 DLL。

【讨论】:

【参考方案2】:

但为什么要创建 DSN?

你可以这样做:

string MyCon = "Driver=Microsoft Access Driver (*.mdb, *.accdb);dbq=C:\\Test2\\test44.accdb";
DataTable MyTable = new DataTable();
OdbcDataAdapter MyData = new OdbcDataAdapter("select * from tblHotels", MyCon);
MyData.Fill(MyTable);

MessageBox.Show("Records = " + MyTable.Rows.Count.ToString() );

我们只需要:

using System.Data;
using System.Data.Odbc;

我的意思是,您的实用程序可能想要创建一个 DSN,但如果您只是想创建一个连接,那么上面的方法就可以了。只要安装了 ACE32 或 ACE 64 位版本,就可以了。

请注意,odbcjt32.dll 是一个仅限 x32 位的组件。您永远不会找到或看到 x64 位版本 - 它不存在。而且安装 ACE x64 也不会安装那个 .dll。

但是,不清楚为什么需要创建 DSN 连接,而不是在应用程序(或某些设置文件)中设置仅具有上述连接字符串的设置?尝试创建 DSN 通常需要提升权限,但您可以使用简单的 ODBC 连接字符串代替 DSN,如上所述。上述代码片段的工作不需要特殊的参考——它只是使用网络框架中内置的 ODBC 部分。

【讨论】:

同意 :)) 但是我创建了一个应用程序来显示我在机器上拥有的驱动程序。这是因为一些 CAD 程序需要 ODBC...长篇大论:)。不过还是谢谢你! 好的。然后请记住,该 .dll 没有 x64 位版本,安装任一位大小版本的 ACE 都不会安装该 .dll。所以你永远不会找到那个 .dll 的 x64 位版本

以上是关于odbcjt32.dll 的真实路径是啥,System32 或 SysWOW64 检查它的参数的主要内容,如果未能解决你的问题,请参考以下文章

DLL文件是啥呀,它有啥作用?

无法定位序数40447于动态链接库libeay32.dll是啥状况

我的solidworks2010安装完后,打开不了,出现could not initialize solidworks utilities.是啥原因呀?

[DllImport("user32.dll")]这句代码是啥意思啊?没学过,解释下…

对于tomcat服务器,地址http://localhost:8080对应的真实文件路径是啥?

DLL是啥意思