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

What is the odbcjt32.dll real path, System32 or SysWOW64 to check it's parameters

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

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

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

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

C:\Windows\SysWOW64

我需要知道原因,因为:

在 Windows 中有此 DLL 的魔术重定向?

感谢您的澄清,

有关 SysWoW64 和 system32 的一些背景信息,请参阅 the super user question "System32 and SysWOW64 on Windows 7"。所以是的,在 windows 上有一个 "magic redirection" 用于 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

但是为什么要创建 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。上面的代码片段不需要特殊的引用就可以工作——它只使用了 net 框架中内置的 ODBC 部分。