SetupDiGetClassDevs вызывает ошибку в XP, приложение, созданное в VS2010, в Win7

Я пишу приложение WPF, которое использует PINVOKE для вызовов DLL, которую я также пишу. В одной из экспортированных функций в dll вызывается SetupDiGetClassDevs. В этот момент при запуске приложения на XP я получаю сообщение об ошибке, прежде всего диалоговое окно с сообщением:

«Не удалось найти точку входа в процедуру RegOpenKeyExW в библиотеке динамической компоновки KERNAL32.dll».

Нажатие «ОК» приводит меня к диалоговому окну необработанного исключения. И приложение WPP, и dll созданы с помощью VS2010 на машине с Win7, и приложение отлично работает на системах с Win7. Проблема возникает только при запуске приложения на XP. Если я избегаю SetupDiGetClassDevs (и последующих вызовов функции SetUpdi) в dll, тогда ничего не пойдет не так; так что кажется, что механизм PINVOKE работает нормально.

Любые идеи, что происходит не так? Я немного смущен тем, что вижу ссылку на RegOpenKeyExW, поскольку dll не построена с включенным UNICODE.

Спасибо, Том.


person Tom Davies    schedule 14.10.2011    source источник


Ответы (1)


Я сильно подозреваю, что проблема заключается в каком-то вашем коде P/invoke или, возможно, в прямой привязке LoadLibrary/GetProcAddress в вашей DLL. Дело в том, что RegOpenKeyEx не является частью kernel32. Экспортируется advapi32. Я не могу поверить, что у вас есть файл .lib, который пытается импортировать его из kernel32, поэтому я думаю, вам следует искать P/invoke или GetProcAddress в вашем коде или, возможно, сторонний код, который вы включаете.

person David Heffernan    schedule 14.10.2011
comment
Я сразу убрал вещи - мое приложение делает только один вызов p/invoke, а вызываемая им функция dll не делает ничего, кроме вызова SetupDiGetClassDevs. Если я уберу вызов SetupDiGetClassDevs в dll, я не получу ошибки. DLL статически ссылается на Setupapi.lib. Как вы сказали, странно, что упоминается KERNEL32. Ссылки на LoadLibrary/GetProcAddress отсутствуют. - person Tom Davies; 14.10.2011
comment
Откуда вы взяли Setupapi.lib? - person David Heffernan; 14.10.2011
comment
Я только что получил Setupapi.lib, указанный в поле «Дополнительные зависимости» в разделе Linker/Input настроек проекта dll. DLL не будет строиться без него. - person Tom Davies; 14.10.2011