PDA

View Full Version : QPluginLoader instance always returns null



meysam_hashemi
11th December 2017, 12:46
Greeting

I created plugin with Qt (5.6.2) and trying to load it but it returns null all the time. I checked several question and also tried the solutions but it didn't work for me.

Can you take a look of the following code and see whats wrong?

DeviceManager.hpp


#ifndef DEVICE_MANAGER_HPP
#define DEVICE_MANAGER_HPP

#include <QtCore>
#include <string>

using namespace std;

class DeviceManager
{

public:
virtual ~DeviceManager() {}

virtual bool initialize() = 0;
virtual string getBrandName() = 0;

};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(DeviceManager, "com.some.address/1.0")
QT_END_NAMESPACE

#endif //DEVICE_MANAGER_HPP

DeviceManagerImpl.hpp


#ifndef DEVICE_MANAGER_IMPL_HPP
#define DEVICE_MANAGER_IMPL_HPP

#include "DeviceManager.hpp"

#include <string>
using namespace std;

class DeviceManagerImpl : public QObject, public DeviceManager
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.some.address/1.0")
Q_INTERFACES(DeviceManager)

public:
DeviceManagerImpl();

//Override Method
bool initialize(); //Have implementation in cpp file
string getBrandName(); //Have implementation in cpp file

private:
...

};

#endif //DEVICE_MANAGER_IMPL_HPP

Pro File


QT += core gui sql

TARGET = Device-Manager
#TARGET = $$qtLibraryTarget(Device-Manager)
TEMPLATE = lib
CONFIG += plugin


SOURCES += \
...

HEADERS += \
...

DISTFILES += Device-Manager.json

unix {
target.path = /usr/lib
INSTALLS += target
}

And this is how i try to load the plugin in my main process.


QPluginLoader * pluginLoader = new QPluginLoader(pluginPath.c_str());
QObject * plugin = pluginLoader->instance();

if (plugin)
{
deviceManager = qobject_cast<DeviceMAnager *>(plugin);
return true;
}
else
{
delete pluginLoader;
return false;
}

Im using QT 5.6.2 and QT Creator and MinGW 32bit.

Thanks in advance.

ChrisW67
12th December 2017, 01:06
QT_BEGIN_NAMESPACE and QT_END_NAMESPACE should not be needed in the header.

When loading, is plugin or deviceManager NULL? If plugin is NULL then the plugin DLL is either not found at all, or unable to load. If deviceManager is NULL (and plugin is not) then the loaded plugin does not contain a QObject handling the interface.
Are you certain the Device-Manager.dll is in the location identified pluginPath?
Are all of the external runtime dependencies of the plugin DLL met in the environment in which it is running? That is, if Device-Manager.dll depends on foolib.dll is that in the PATH?

meysam_hashemi
12th December 2017, 05:14
QT_BEGIN_NAMESPACE and QT_END_NAMESPACE should not be needed in the header.

When loading, is plugin or deviceManager NULL? If plugin is NULL then the plugin DLL is either not found at all, or unable to load. If deviceManager is NULL (and plugin is not) then the loaded plugin does not contain a QObject handling the interface.
Are you certain the Device-Manager.dll is in the location identified pluginPath?
Are all of the external runtime dependencies of the plugin DLL met in the environment in which it is running? That is, if Device-Manager.dll depends on foolib.dll is that in the PATH?

Thanks for reply. The plugin is in correct path and pluginLoader is not null but instance() return null. I think that one of run-time dependencies is missing or something. I'm breaking the code to several part and testing it to find out what exactly is wrong!

meysam_hashemi
12th December 2017, 09:18
I found the reason but i have no idea why it cause the problem, Im using library that is linked to project but when i use its function, The instance returns null.



LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib
INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)/INCLUDE


Can anyone tell me why it happens?

high_flyer
12th December 2017, 10:42
mixed build mode perhaps? (release/debug)

meysam_hashemi
12th December 2017, 14:30
mixed build mode perhaps? (release/debug)

No, Both are in debug!
The thing is, I did something exactly like this before with CMakeList.txt and Visual Studio but its not working with MinGW and QT Creator . I'm missing something but i have no idea what it is !!!

Added after 18 minutes:

The following configs of library and plugin in `CMakeList.txt` work perfectly fine when i make the project with `Visual Studio`. (Made with CMake)


ADD_DEFINITIONS(${QT_DEFINITIONS})
ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
ADD_DEFINITIONS(-DQT_PLUGIN)
ADD_DEFINITIONS(-DQT_SHARED)
ADD_DEFINITIONS(-DQT_DLL)
ADD_DEFINITIONS(-DQT_LARGEFILE_SUPPORT)
ADD_DEFINITIONS(-DQT_THREAD_SUPPORT)

INCLUDE_DIRECTORIES(
${STANDARD_XFS_DIRECTORY}/INCLUDE
)

LINK_DIRECTORIES(
${STANDARD_XFS_DIRECTORY}
${STANDARD_XFS_DIRECTORY}/LIB
)

SET(XFS_LIBS
MSXFS
xfs_conf
SSIDLL
)

TARGET_LINK_LIBRARIES(Device-Manager
${XFS_LIBS}
)

And this is the configs of library and plugin in `.pro` file in `Qt Creator` with `MinGW` which is not working when i use the library.


QT -= gui
QT += core sql

TARGET = Device-Manager
TEMPLATE = lib
CONFIG += plugin
CONFIG += c++11

DEFINES += DEVICEMANAGER_LIBRARY

INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)
INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)/INCLUDE
message(Include : $${INCLUDEPATH})

LIBS += $$(STANDARD_XFS_DIRECTORY)/SSIDLL.lib
LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib
LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/xfs_conf.lib
message(Lib : $${LIBS})

So i can say the code it self is fine and i'm definitely missing some configs in `.pro` file.

PS1: Plugin and the application that load the plugin, Both have `INCLUDEPATH` and `LIBS` of the library in their pro file.

PS2: The application and the plugin both are in debug mode

PS3: I dont get any compile error or linker error during compile.

high_flyer
12th December 2017, 15:16
No, Both are in debug!
do you have any other 3rd party dependencies which might be in release?

I'd try to build your project in release and try to see if it works, its an easy test worth trying.

meysam_hashemi
12th December 2017, 16:26
do you have any other 3rd party dependencies which might be in release?

I'd try to build your project in release and try to see if it works, its an easy test worth trying.

No man i dont

I made simple console application and included my library header and lib file and called the function and this is the error i get when i run the application. So it must be it. But seriously why!!!

The Code:


LPWFSRESULT result = new WFSRESULT();
WFSFreeResult(result)

12723

high_flyer
12th December 2017, 18:14
Is this typo 'DeviceMAnager' really in the code or only in the code posted here?:


if (plugin)
{
deviceManager = qobject_cast<DeviceMAnager *>(plugin);
return true;
}


I'd add some defencive code here:


QPluginLoader * pluginLoader = new QPluginLoader(pluginPath.c_str());
QObject * plugin = pluginLoader->instance();

if (plugin)
{
deviceManager = qobject_cast<DeviceMAnager *>(plugin);
if(deviceManager) return true;
return false;;
}
else
{
delete pluginLoader;
return false;
}

ChrisW67
12th December 2017, 21:46
Your screenshot clearly shows error 0xc0000135, which means STATUS_DLL_NOT_FOUND. This goes back to:

Are all of the external runtime dependencies of the plugin DLL met in the environment in which it is running? That is, if Device-Manager.dll depends on foolib.dll is that in the PATH?
Is the MSXFS.DLL in the run time PATH of the process or in the same directory as the plugin DLL? Is everything the MSXFS.DLL depends on also in one of those locations?

meysam_hashemi
13th December 2017, 12:22
Your screenshot clearly shows error 0xc0000135, which means STATUS_DLL_NOT_FOUND. This goes back to:

Is the MSXFS.DLL in the run time PATH of the process or in the same directory as the plugin DLL? Is everything the MSXFS.DLL depends on also in one of those locations?

Yes.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Well, I found the problem however its so silly. I run project over windows 10 32 bit and it work fine. Maybe something is not incompatible with 64 bit and that caused this mess.

Thanks everyone for all your solution and i hope your solutions help others problem.

Thanks alot!