Не удается найти DLL плагина платформы после запуска windeployqt

Я делаю VST аудио плагин наедине с отдельным exe-файлом, оба разделяют большую часть кода, и я пытаюсь сделать всплывающее окно, используя Qt Quick.

В самом начале я скопировал библиотеки Qt из установочных bin папка в папку моих двоичных файлов, но не копировать что-либо из plugins а также qml папка. Всплывающее окно работает правильно в версии exe; но для версии VST, он утверждает, что DLL для QtQuick.Controls не может быть загружен. Некоторый отладочный вывод в Visual Studio прилагается ниже:

“vsthost.exe”(Win32): 已加载“D:\development\Qt\5.10.1\msvc2017_64\qml\QtQuick\Controls.2\qtquickcontrols2plugind.dll”。已加载符号。
“vsthost.exe”(Win32): 已卸载“D:\development\Qt\5.10.1\msvc2017_64\qml\QtQuick\Controls.2\qtquickcontrols2plugind.dll”
file:///D:/my_project_folder/ParamPopForm.ui.qml:2:1: plugin cannot be loaded for module "QtQuick.Controls": Cannot load library D:\development\Qt\5.10.1\msvc2017_64\qml\QtQuick\Controls.2\qtquickcontrols2plugind.dll: (some messy broken characters)
     import QtQuick.Controls 2.3 
     ^
windows\dwm\dwmapi\attribute.cpp(92)\dwmapi.dll!00007FFC62FC594E: (caller: 00007FFC62D8071A) ReturnHr(31) tid(79c) 80070006 句柄无效。
windows\dwm\dwmapi\attribute.cpp(92)\dwmapi.dll!00007FFC62FC594E: (caller: 00007FFC62D8071A) ReturnHr(32) tid(79c) 80070006 句柄无效。
windows\dwm\dwmapi\attribute.cpp(92)\dwmapi.dll!00007FFC62FC594E: (caller: 00007FFC62D8071A) ReturnHr(33) tid(79c) 80070006 句柄无效。
windows\dwm\dwmapi\attribute.cpp(92)\dwmapi.dll!00007FFC62FC594E: (caller: 00007FFC62D8071A) ReturnHr(34) tid(79c) 80070006 句柄无效。
windows\dwm\dwmapi\attribute.cpp(92)\dwmapi.dll!00007FFC62FC594E: (caller: 00007FFC62D8071A) ReturnHr(35) tid(79c) 80070006 句柄无效。
windows\dwm\dwmapi\attribute.cpp(92)\dwmapi.dll!00007FFC62FC594E: (caller: 00007FFC62D8071A) ReturnHr(36) tid(79c) 80070006 句柄无效。

Странно, но DLL уже загружена, но внезапно выгружена

После некоторых усилий я нашел windeployqt соберет все необходимое для запуска программы Qt. Затем я запускаю его с:

D:\development\Qt\5.10.1\msvc2017_64\bin\windeployqt.exe -qmldir D:\projects\my_dir_containing_qml_file MyVstPlugin.dll

После этой операции все стало еще хуже: теперь и exe, и VST не могут найти платформу DLL. Однако я вижу, что файл DLL платформы находится на platforms/qwindowsd.dllв том же каталоге других собранных файлов DLL Qt.

Кроме того, я обнаружил, что Qt5Cored.dll модифицируется windeployqt, так как время его мода изменилось. И я нашел вариант --no-patchqt не исправлять библиотеку Qt5Core. Для чего используется исправление?

1 ответ

Погрузившись в исходный код Qt, я частично решил проблему, добавив пути поиска перед созданием объектов Qt.

DLL-библиотеки платформы ищутся в подкаталоге платформы в каждом пути к библиотеке, который указан в QFactoryLoader::update() метод в qfactoryloader.cpp, экземпляр в Q_GLOBAL_STATIC_WITH_ARGS в начале qplatformintegrationfactory.cpp. Система Qt заполняет пути к библиотекам текущим рабочим каталогом. Тем не менее, каталог, содержащий ваши DLL не упоминается вообще. Поэтому вы должны передать его в систему Qt, прежде чем создавать что-либо.

Поскольку мы используем JUCE для разработки VST, путь к DLL можно добавить:

QCoreApplication::addLibraryPath( juce::File::getSpecialLocation( juce::File::currentExecutableFile ).getParentDirectory().getFullPathName().toRawUTF8() );
app = new QGuiApplication( argc, argv );

Кроме того, вы должны передать его в путь поиска библиотеки QML:

window = new QQuickView;
window->engine()->addPluginPath( juce::File::getSpecialLocation( juce::File::currentExecutableFile ).getParentDirectory().getFullPathName().toRawUTF8() );
window->engine()->addImportPath( juce::File::getSpecialLocation( juce::File::currentExecutableFile ).getParentDirectory().getFullPathName().toRawUTF8() );
window->setGeometry( 100, 100, 400, 650 );
window->setSource( QUrl::fromLocalFile( WOL_SOURCE_DIR "/src/GUI/ParamPopForm.ui.qml" ) );
window->show();

Тем не менее, это по-прежнему не решает сбой внезапной разгрузки QtQuick.Controls DLL, это может иметь "более глубокие" причины.

Другие вопросы по тегам