Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов функций SetupAPI из DLL  (Прочитано 12656 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Drapten
Новенький

eu
Offline Offline

« : 23-01-2012 13:35 » new

Добрый день!

Пишу библиотеку-обертку для функций работы с драйвером WinUSB. Для получения данных о подключенный устройствах использую средства библиотеки SetupAPI.dll.
Столкнулся с такой проблемой. Непосредственно из консольного приложения вызов всех необходимых функций проходит без каких-либо запинок, все работает, пересылается и определяется. Но как только я пытаюсь получить доступ к функции, например, SetupDiGetClassDevs происходит ошибка выполнения программы:

Unhandled exception at 0x000259a6 in TestDLL.exe: 0xC0000005: Access violation reading location 0x000259a6.

Используя тот же код в проекте DLL, поменяв тип приложения с DLL на EXE и выбрав подсистему консоли вызываю эту же функцию в функции _tmain - все работает корректно. То есть ошибка возникает только при попытке сквозного вызова через DLL. Подскажите пожалуйста в чем может быть проблема, может быть кто-то уже сталкивался с этим случаем или подобным ему.

Упреждая некоторые советы:

1. Нагуглил где-то что надо заменить название функции SetupDiGetClassDevs добавив в конце W для использования с символами Unicode ибо в setupapi.dll такой функции нет. Пробовал - ни замена на A, ни замена на W не помогла.
2.
Код: (C++)
GUID guidDeviceInterface = { 0xf4765f40, 0xd4e5, 0x4f52, { 0xb0, 0x57, 0x74, 0xcd, 0x1b, 0x4c, 0xeb, 0xc3 } };
HDEVINFO hDeviceInfo;
hDeviceInfo = SetupDiGetClassDevs(&guidDeviceInterface,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

Вот так выглядит вызов самой функции на которой происходит падение. Пробовал заменить точный GUID на NULL для перечисления всех устройств, не помогло. Ошибка видимо в самом вызове функции.

При необходимости могу предоставить более полные листинги программы или другую информацию, если это позволит прояснить картину более четко.

Заранее благодарен за помощь!
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-01-2012 14:25 » 

setupapi.lib линкуете?
линковка статическая/динамическая?
отладчик показывает вообще тело SetupDiGetClassDevs?
с линковкой возможно траблы...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Drapten
Новенький

eu
Offline Offline

« Ответ #2 : 23-01-2012 15:36 » 

К проекту DLL линкую обязательно, иначе не соберется. К тестовому консольному приложению не линкую, но и не ругается он на это, что не хватает функций ему. Надо будет попробовать.
DLL свою линкую динамически, все функции по именам находятся, указатели принимаются, выполняются все действия кроме работы с устройством.
Если запускаю в режиме отладки проект с библиотекой то не показывает, он же получается не может знать тело той функции что зашита в библиотеке.
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 23-01-2012 16:01 » 

отчего не может... может. идите по шагам внутрь функции. если библиотека в дебаге собрана точно так же все должно показать. может только путь к исходникам попросит сказать... хотя уже не помню подробностей но все возможно)
или сделайте активным проект библиотеки. но в качестве запускаемого модуля пропишите тот exe-шник который ее вызывает.

попробуйте статическую линковку... если с ней заработает можно будет думать дальше)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Drapten
Новенький

eu
Offline Offline

« Ответ #4 : 23-01-2012 16:40 » 

Ну библиотека setupapi.lib вряд ли в дебаге собрана, оттого и неизвестность как он туда зайдет, в мою библиотеку он естественно заходит, идет до функции SetupDiGetClassDevs и на ее выполнении и отпадает. Может я не совсем Вас понял правильно, надо будет попробовать включить все пути к setupapi в проект, может поможет.
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 23-01-2012 20:15 » 

нет, я имел ввиду идти в dll до SetupDiGetClassDevs )
внутрь SetupDiGetClassDevs думаю смотреть не стоит) хотя... можно на всякий случай посмотреть - действительно ли размещена SetupDiGetClassDevs по вызванному адресу... по-моему отладчик названия блоков ассемблерного кода размечает названиями функций даже если не отладочный модуль

второй момент - соберите с нуля отдельный тестовый проект совсем без ничего лишнего: только dll с одной функцией и консольный exe, ее вызывающий. может где то ошибка в другом месте выплывает таким боком?
второе, попробуйте в нем использовать "SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);"
PS выложите этот проектик) нашел похожий вопрос... нерешенный.

да, SetupApi статически включает еще 7 файлов... если они не загрузятся - то и библиотека не загрузится...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Drapten
Новенький

eu
Offline Offline

« Ответ #6 : 24-01-2012 07:08 » 

А, все понял, в тело функции DLL конечно заходит, идет по всем операциям до строчки:
Код:
hDeviceInfo = SetupDiGetClassDevs(&guidDeviceInterface,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
и на ней происходит крах всего.

На счет второго момента я еще до того как написать пост попробовал следующее, в том же проекте DLL добавил тестовую функцию которая складывает два числа и возвращает какой-то простой return. При ее вызове из тестового приложения все прошло гладко, вернулось все нормально, никаких ошибок не появилось. Также если закомментировать вызов функции SetupDiGetClassDevs функция также возвращается. Отсюда я сделал вывод что библиотека сама по себе работает, функции экспортирует корректно и дальше не стал копать в ту сторону.

Вызвать функцию с другим флагом попробую, напишу о результатах. Выкладываю весь проект целиком, и DLL и тестовое приложение.

http://narod.ru/disk/38653006001/DeviceDLL.zip.html
Прошу прощения за размер файла, не сразу обратил внимания. Могу выложит только текстовые файлы если надо, тут со всеми отладочными символами и историей работы.

P.S. Я кстати тоже использую WinXP + VS2010. Версия WDK - 7600.16385.1. Почитаю тогда тот пост, может что полезное найду.

Добавлено через 1 час, 52 минуты и 51 секунду:
Вопрос решен.

Ошибка была в вызове функции LoadLibraryEx с неправильным флагом, замена на LoadLibrary все исправила.
« Последнее редактирование: 24-01-2012 09:01 от Drapten » Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 24-01-2012 09:16 » 

вот и славно Ага
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines