SetupDiGetClassDevs 在 XP 上导致错误,在 VS2010 中内置的应用程序,在 Win7 上

Posted

技术标签:

【中文标题】SetupDiGetClassDevs 在 XP 上导致错误,在 VS2010 中内置的应用程序,在 Win7 上【英文标题】:SetupDiGetClassDevs causing error on XP, app built in VS2010, on Win7 【发布时间】:2011-10-14 14:54:59 【问题描述】:

我正在编写一个 WPF 应用程序,它使用 PINVOKE 来调用我也在编写的 dll。在 dll 中的一个导出函数中,调用了 SetupDiGetClassDevs。此时,在XP上运行应用程序时,我得到一个错误,首先是一个对话框说:

“无法在动态链接库KERNAL32.dll中找到程序入口点RegOpenKeyExW。”

点击确定然后我会进入一个未处理的异常对话框。 WPP应用程序和dll都是在Win7机器上用VS2010构建的,应用程序在Win7系统上运行良好。只有在 XP 上运行应用程序时才会出现此问题。如果我避免在 dll 中使用 SetupDiGetClassDevs(以及随后的 SetUpdi 函数调用),则不会出错;所以看起来PINVOKE机制工作正常。

有什么想法吗?我对看到引用 RegOpenKeyExW 感到有些困惑,因为 dll 不是在启用 UNICODE 的情况下构建的。

谢谢 汤姆

【问题讨论】:

【参考方案1】:

我强烈怀疑问题出在您的某些 P/invoke 代码中,或者可能是您的 DLL 中的直接 LoadLibrary/GetProcAddress 绑定。问题是,RegOpenKeyEx 不是kernel32 的一部分。它由advapi32 导出。我不敢相信您有一个 .lib 文件试图从 kernel32 导入它,所以我认为您应该在您的代码或您包含的第三方代码中查找 P/invoke 或 GetProcAddress .

【讨论】:

我已经剥离了一些东西——我的应用程序只进行了一次 p/invoke 调用,而它调用的 dll 函数除了调用 SetupDiGetClassDevs 之外什么都不做。如果我在 dll 中删除对 SetupDiGetClassDevs 的调用,则不会出现错误。 dll 静态链接到 Setupapi.lib。就像你说的,提到 KERNEL32 很奇怪。没有 LoadLibrary/GetProcAddress 引用。 您从哪里获得 Setupapi.lib? 我刚刚在 dll 项目设置的链接器/输入部分的“附加依赖项”字段中列出了 Setupapi.lib。没有它,dll 将无法构建。

以上是关于SetupDiGetClassDevs 在 XP 上导致错误,在 VS2010 中内置的应用程序,在 Win7 上的主要内容,如果未能解决你的问题,请参考以下文章

使用 SetupAPI 找出活动的图形驱动程序

如何在 vc++ 中获取 USB 存储设备的详细信息

VS2012能够安装在XP系统上吗?

怎么让XP支持xp的VHD启动

VISTA和XP双系统问题

如何将win10桌面变成xp桌面图标