Не удается загрузить библиотеку * .dll Неизвестная ошибка 0x000000c1 - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь вызвать controller.dll из проекта qt, используя QLibrary, но он возвращает такую ​​ошибку. Не удается загрузить библиотеку E: \ "абсолютный путь к dll" \ controller.dll: неизвестная ошибка 0x000000c1. Что это значит?

QLibrary lib;
lib.setFileName("E:\\absolute path to the dll\\controller.dll");
if(lib.load()) {
    qDebug()<<"Loaded";
} else {
    qDebug()<<"Not loaded";
    qDebug()<<lib.errorString();
}

1 Ответ

3 голосов
/ 07 апреля 2020

Список ошибок , который вам нужен, находится здесь . Символическое c имя для этой ошибки - ERROR_BAD_EXE_FORMAT, а сообщение об ошибке - <filesoandso> is not a valid Win32 application. DLL, которую вы пытаетесь открыть, либо повреждена, либо - скорее всего - - для другой архитектуры . Если вы компилируете для 32-битных, используйте 32-битные DLL. Если вы компилируете для 64 бит, используйте 64-битные DLL.

Скорее всего, в вашей системе есть как 32-, так и 64-битный компилятор. Если вы используете Qt Creator, его легко переключать - просто выберите другой комплект. На скриншоте ниже не показаны 64-битные наборы, но они должны быть, если вы их установили при установке Qt.

A screenshot from Qt Creator, displaying the Project pane in lower left corner of the application.

Почему ошибка называется «плохой EXE», а не «плохая DLL»? Потому что в Windows оба файла имеют идентичный формат PE (Portable Executable), и только наличие информации о запуске внутри файла превращает PE-файл в исполняемый файл, который можно запускать самостоятельно. EXE может делать все, что может DLL, включая экспорт символов:)

В качестве отступления: используйте одиночные косые черты. Qt внутренне использует косые черты для разделителей пути. Таким образом, он может легко оставаться кроссплатформенным. Он переводит их, когда ему нужно интерфейс с ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...