Aufgrund einer Störung des s3 Storage, könnten in nächster Zeit folgende GitLab Funktionen nicht zur Verfügung stehen: LFS, Container Registry, Job Artifacs, Uploads (Wiki, Bilder, Projekt-Exporte). Wir bitten um Verständnis. Es wird mit Hochdruck an der Behebung des Problems gearbeitet. Weitere Informationen zur Störung des Object Storage finden Sie hier: https://maintenance.itc.rwth-aachen.de/ticket/status/messages/59-object-storage-pilot

Commit 8fdc1868 authored by Leander Schulten's avatar Leander Schulten
Browse files

Use Windows API instead of QT to load the library, because QLibrary will not...

Use Windows API instead of QT to load the library, because QLibrary will not search in the folder of the lib for dependencies
parent e65d18ae
......@@ -6,6 +6,9 @@
#include "dmxchannelfilter.h"
#include <QDir>
#include <cstring>
#ifdef Q_OS_WIN
#include <windows.h>
#endif
HardwareInterface * driver = nullptr;
......@@ -27,7 +30,29 @@ namespace Driver {
bool loadDriver(QString path){
#if defined(Q_OS_WIN)
typedef HardwareInterface * (*getDriverFunc)();
getDriverFunc getDriver = reinterpret_cast<getDriverFunc>(QLibrary::resolve(path,"getDriver"));
// we have to load the library with the Windows API to handle dependecies in the same folder, see https://bugreports.qt.io/projects/QTBUG/issues/QTBUG-74001
path.replace("/","\\");
auto pathC = path.toStdString();
auto handle = LoadLibraryExA(pathC.c_str(),nullptr, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR|LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
if(handle == nullptr){
auto errorCode = GetLastError();
qDebug() << "Loading of lib failed, error code: "<<errorCode;
if(errorCode == 126)
ErrorNotifier::get()->newError("Fehler beim laden der DLL, Abhängigkeiten zu anderen DLLs konnten nicht geladen werden.");
else{
ErrorNotifier::get()->newError("Fehler beim laden der DLL. Error code: " + QString::number(errorCode));
}
return false;
}
auto func = GetProcAddress(handle,"getDriver");
if(func == nullptr){
auto errorCode = GetLastError();
qDebug() << "Loading of lib failed, error code: "<<errorCode;
ErrorNotifier::get()->newError("Fehler beim laden der Funktion \"getDriver\" aus der DLL, Fehlercode: " + QString::number(errorCode));
return false;
}
getDriverFunc getDriver = reinterpret_cast<getDriverFunc>(func);
//getDriverFunc getDriver = reinterpret_cast<getDriverFunc>(QLibrary::resolve(path,"getDriver"));
if(getDriver!=nullptr){
HardwareInterface * inter = getDriver();
if(inter != nullptr){
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment