无法在 DLL 'kernel32.dll' 中找到名为 'InterlockedIncrement' 的入口点 - VS2005@Win7 64 位

Posted

技术标签:

【中文标题】无法在 DLL \'kernel32.dll\' 中找到名为 \'InterlockedIncrement\' 的入口点 - VS2005@Win7 64 位【英文标题】:Unable to find an entry point named 'InterlockedIncrement' in DLL 'kernel32.dll' - VS2005@Win7 64 bit无法在 DLL 'kernel32.dll' 中找到名为 'InterlockedIncrement' 的入口点 - VS2005@Win7 64 位 【发布时间】:2011-07-17 09:25:21 【问题描述】:

我的 Visual Studio 2005 C# 项目有问题。从星期一开始,我一直在 Windows XP 下使用它。然后我的笔记本电脑坏了,在我的新笔记本电脑上我有 Windows 7 64 位,我仍在使用 VS 2005。

源代码编译没有问题,但是当我运行程序时,它在下面一行中断

OdbcConnection cn;
cn = new OdbcConnection("dsn=My_dsn_name;");

我得到错误:

EnrtyPointNotFoundExcepition 未停止

无法在 DLL“kernel32.dll”中找到名为“InterlockedIncrement”的入口点

我正在尝试使用 PostgresODBC 64 位驱动程序连接 Postgres 8.4 数据库。

欢迎任何解决方案或解决方法。我需要强调的是,我正在构建的解决方案需要在 Windows XP 32bit 下运行。

有关该问题的更新信息(来自我对 cme​​ts 的回复,但不仅限于此):

    当我尝试向我的 VS 项目添加新连接时,我收到消息 ERROR [IM014] [Microsoft][ODBC Driver Manager] The specified DSN contains a architecture mismatch between the Driver and Application。我使用 Windows 7 64 位,Postgres ODBC 64 位驱动程序版本。 9.00.0200,Postgres 8.4 32 位。 我以前从未使用过Dependency Walker。但是我已经从 \system32\SysWOW64 打开了 kernel32.dll 并且 InterlockedIncrement 存在于两者的文件中文件夹。 我有一些 TableAdapter,我用它们从 Postgres 中获取数据。这是我在使用WinXP时设置的,现在仍然有效。另一方面,在 VS2005 中的 TableAdapter 属性中,我单击 Data->CommandText 旁边的“...”,它会显示一条消息无法调用 ODBC 驱动程序连接实用程序。

编辑:我在上面添加了第 1-3 点。

【问题讨论】:

这完全没有意义。您能否使用 Dependency Viewer 检查 kernel32.dll 中是否存在所谓的缺失导出(在 C:\Windows\system32 和 C:\Windows\SysWOW64 中)。 我以前从未使用过Dependency Walker。但是我已经从 \system32\SysWOW64 打开了 kernel32.dll 并且 InterlockedIncrement 都存在于两者的文件中文件夹。 您使用的是 32 位版本的 depends.exe - 32 位版本总是加载 c:\system\syswow64 版本的 kernel32.dll,即使您尝试加载 64 - 位一。试试 64 位版本的 depends.exe,你会发现 64 位版本的 kernel32.dll 中缺少这些导出 【参考方案1】:

在 64 位 Windows 上,这些不是从 kernel32.dll 导出的真正函数 - 它们是编译器内在函数。 P/Invoking 该函数的代码应该使用 Interlocked 托管类。

现在它们也是 32 位窗口上的内部函数,但出于应用程序兼容性的原因,导出的函数仍然可以从 32 位窗口上的 kernel32.dll 获得。 64 位没有问题,因为没有兼容的应用程序。

【讨论】:

好吧,在我的 64 位 Windows 中,kernel32 有这些导出。事实上,MSDN 清楚地记录了它。所以我不相信。 我的没有。请记住,64 位 Windows 系统上有两个版本的 kernel32.dll - 32 位版本位于 c:\windows\SysWOW64 中,它具有 InterlockedIncrement,64 位版本位于 c:\windows\system32没有。您可能正在使用 32 位版本的depends.exe,由于某种原因(可能是文件重定向 - 如果是文件重定向,这可能是depends.exe 中的一个错误)甚至会加载 32 位版本的 DLL如果你从 c:\windows\system32 加载它 我的 Dependency Walker for Win32 ver 2.1.3790 在 Win7 64 位下运行,显示两个文件夹中的 kernel32.dll 具有 InterlockedIncrement。它不加载 32 位版本,因为它显示了被调查文件的路径,并且在两种情况下都不同。 @Stewart 是的,你是对的! 32 位程序中的文件对话框只能通过 sysnative 访问 64 位系统文件夹。我知道但忘记了!通过 sysnative 加载它,这些导出确实丢失了。 我下载了64位版本,你是对的!我从没想过会这样,但这是真的。无论如何,64位版本可以从dependencywalker.com下载【参考方案2】:

我刚刚遇到了完全相同的问题,并找到了一个非常简单的解决方案: 在导入中使用 System.Data.Odbc 而不是 Microsoft.Data.Odbc。

【讨论】:

【参考方案3】:

我猜你的驱动程序有问题。我不能确定,但​​你可能想考虑使用其他东西。 Npgsql 看起来相当不错,而且它是 100% 的 C# 代码,所以它应该可以在 Windows XP 32 位上运行而没有任何问题。

【讨论】:

不知道是不是驱动问题。但是,我有一些 TableAdapters,我使用它们从 Postgres 中获取数据。这是我在使用WinXP时设置的,现在仍然有效。另一方面,当在 TableAdapter 的属性中的 VS2005 中,我单击 Data->CommandText... /i> 它显示一条消息调用 ODBC 驱动程序连接实用程序失败【参考方案4】:

我想我已经解决了问题,虽然我不确定。但是,我安装了 32 位版本的 Postgres ODBC 驱动程序并且我使用了 32 位版本的 ODBC 管理员 C:\Windows\SysWOW64\odbcad32.exe 来配置连接。我在线程 64-bit-odbc-exception 中找到了有关 32 位 ODBC 管理器的信息,其中一位用户引用了 MSDN: Managing Data Sources。

我认为我需要与我的操作系统相同版本的 ODBC 驱动程序(关于位数)。我也尝试过 64 位版本的 Postgres 和 ODBC 驱动程序,但它也不想为我工作。唯一的解决方案是 32 位版本的 Postgres、ODBC 和 32 位 ODBC 管理器中的连接集

关于我的 VS 项目,我将 Project->Properties->Build->Platform target 设置为 x86

希望它在未来对某人有所帮助。

【讨论】:

以上是关于无法在 DLL 'kernel32.dll' 中找到名为 'InterlockedIncrement' 的入口点 - VS2005@Win7 64 位的主要内容,如果未能解决你的问题,请参考以下文章

Windows2008R2无法定位程序输入点于动态链接库kernel32.dll

开机运行软件,出现kernel32.dll错误?求解决方案

无法定位程序输入点GetTickCount64与动态链接库KERNEL32.dll上

Windows Xp - 无法找到入口点 gettickcount64 kernel32.dll

无法定位程序输入点 GetTickCount64 于动态链接库 KERNEL32.dll 上,怎么办

无法定位程序输入点InitializeSRWLock于动态链接库KERNEL32.dll 上