写在前面:
1. 同一个dll在同一个进程中,多次load,返回句柄是否一样,全局变量和静态变量是否共享?
:是一样的,变量共享并保存
2. 在1之上,free后,再次load,句柄是否一样,全局和静态变量是否被保存?
:不一定,变量不共享,当free后,dll资源都释放了,也就不存在了。
1和2即使不在同一个线程,只要同一个进程也成立。
总结:同一个进程,多次load同一个dll,句柄和函数指针都不会变,全局变量和静态变量也会共享,只有dll完全free后才会释放所有资源,
此时再次load后,又重新分配资源,之前的全局变量和静态变量的值不会被保存的。
3. Linux的so呢
4. Qt的plugin也同上,QPluginLoader-->QLibrary-->QLibraryPrivate-->QLibraryStore。
【qt插件开发一般步骤】
1. 新建一个接口插件,里面只有接口没有实现,就是一个抽象类
新建工程--->Library--->C++Library--->下一步下一步输入项目名称,type选择Qt Plugin
然后在pro中 DEFINES += API_INTERFACEPLUGIN_EXPORT
2. 新建接口导出类
#ifdef INTERFACEPLUGIN_CLASS_LIBRARY
#define API_INTERFACEPLUGIN_EXPORT Q_DECL_EXPORT //声明接口导出
#else
#define API_INTERFACEPLUGIN_EXPORT Q_DECL_IMPORT //声明接口导入
#endif
#include <QObject>
#include <QtGlobal>
#define InterfacePlugin_IID "com.plugintest.interfaceplugin.iid"
【需要导出】
class API_INTERFACEPLUGIN_EXPORT InterfacePlugin : public QObject
{
Q_OBJECT
public:
explicit InterfacePlugin(QObject *parent = nullptr);
virtual ~InterfacePlugin();
virtual void test()=0;
private:
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(InterfacePlugin, InterfacePlugin_IID)
QT_END_NAMESPACE
3.新建实现接口插件的类,同上
然后在pro中包含InterfacePlugin头文件库目录
INCLUDEPATH += \
$$PWD/../InterfacePlugin
同时引入库(这步骤相当于是隐式加载dll)
LIBS += -L$$PWD/../$${MY_OUTPUT_DIR}/ -lInterfacePlugin
#include "InterfacePlugin.h"
【不需要导出】
class BirdPlugin : public InterfacePlugin
{
Q_OBJECT
Q_INTERFACES(InterfacePlugin)
Q_PLUGIN_METADATA(IID InterfacePlugin_IID)
public:
explicit BirdPlugin(QObject *parent = nullptr);
virtual ~BirdPlugin();
virtual void test(){。。。。。。}
private:
};
4.在exe主应用中,只需要
INCLUDEPATH += \
$$PWD/../InterfacePlugin
LIBS += -L$$PWD/../$${MY_OUTPUT_DIR}/ -lInterfacePlugin
包含接口头文件和引入接口插件即可,
因为其他插件是间接被加载的
QPluginLoader