Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 7 SetupDiGetClassDevs在Win7上的XP、VS2010内置的应用程序上导致错误_Windows 7_Windows Xp_Pinvoke_Setupapi - Fatal编程技术网

Windows 7 SetupDiGetClassDevs在Win7上的XP、VS2010内置的应用程序上导致错误

Windows 7 SetupDiGetClassDevs在Win7上的XP、VS2010内置的应用程序上导致错误,windows-7,windows-xp,pinvoke,setupapi,Windows 7,Windows Xp,Pinvoke,Setupapi,我正在编写一个WPF应用程序,它使用PINVOKE调用我正在编写的dll。在dll中的一个导出函数中,调用SetupDiGetClassDevs。此时,在XP上运行应用程序时,我收到一个错误,首先是一个对话框: “在动态链接库KERNAL32.dll中找不到过程入口点RegOpenKeyExW。” 单击“确定”,然后我会看到一个未处理的异常对话框。WPP应用程序和dll都是在Win7机器上使用VS2010构建的,并且该应用程序在Win7系统上运行良好。只有在XP上运行应用程序时才会出现此问题。如

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

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

单击“确定”,然后我会看到一个未处理的异常对话框。WPP应用程序和dll都是在Win7机器上使用VS2010构建的,并且该应用程序在Win7系统上运行良好。只有在XP上运行应用程序时才会出现此问题。如果我在dll中避免setupDiGetClassDev(以及后续的SetUpdi函数调用),那么就不会出现任何问题;看来PINVOKE机制工作正常

你知道怎么回事吗?看到引用RegOpenKeyExW,我有点困惑,因为dll并没有启用UNICODE

谢谢
Tom

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

我强烈怀疑问题在于你的一些P/invoke代码,或者在DLL中直接绑定

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