Не удается найти DLL плагина платформы после запуска windeployqt - PullRequest
0 голосов
/ 18 февраля 2019

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

В самом начале я скопировал DLL-библиотеки 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 Ответ

0 голосов
/ 20 февраля 2019

После погружения в исходный код 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, возможно, у этого есть "более глубокие" причины.

...