Это может быть немного специфично для Qt, но здесь мы идем ...
У меня есть приложение Qt, которое мне нужно для взаимодействия с парой внешних библиотек, написанных на C. Кажется, все работает, так как я могу правильно связать, но когда я пытаюсь вызвать любую функцию в одной из библиотек Я всегда получаю ошибку нарушения доступа. Для другой библиотеки я вызываю около 10 функций в моем процессе, но 11-я дает мне то же самое. Я приведу подробности для первого здесь, так как я думаю, что должно быть более очевидно, что не так.
Библиотека поставляется с .lib
, .h
и устанавливает .dll
в system32. Вот объявление функции из .h
:
__declspec(dllimport) unsigned short InPortB(unsigned long Port);
Библиотека поставляется с цифровой картой ввода-вывода, в которую вы используете эту функцию для записи данных. Порт - это адрес карты. Я знаю, что адрес равен 0xdeb0, и я могу проверить, что запись по этому адресу действительна, потому что образец кода, который я получил с картой, делает это без ошибок. Пример кода, который я получаю, представляет собой решение C ++ VS2005. Я могу построить это, и все в порядке. Когда я пытаюсь скопировать пример кода в мое приложение Qt, я получаю нарушение прав доступа.
Итак, я сначала подумал, что существует несоответствие с соглашениями о вызовах, но я не вижу, как приложение связалось бы, если бы это было так.
Я только что посмотрел на exe моего приложения в зависимости, и это немного странно. Похоже, мое приложение на самом деле не вызывает ни одну из функций во внешней библиотеке. Кроме того, когда я просматриваю выходные данные отладки из сообщения об ошибке Windows, я не вижу загруженную DLL-библиотеку.
Нужно ли вручную загружать dll? Мне не нужно ничего делать с DLL при запуске проекта Visual Studio, так что это не имеет смысла для меня. Я здесь довольно заблудился.