Qt插件热加载-QPluginLoader实现

上一篇C++消息框架-基于sigslot文章中咱们讲述了使用sigslot信号槽实现本身的消息框架,这是一个比较粗糙,并且小的框架。当咱们的程序逐渐变大时,咱们可能就会考虑功能插件化,或者支持某些模块动态加载和卸载。app

功能动态加载,也就是咱们平时所说的插件化,插件支持热插拔。框架

以前工做中,恰好接触过这一块的内容。下面是一个Qt加载dll的方式,当咱们把dll加载上之后,能够尝试转化为PluginInterface接口,若是能够转换成功,则说明咱们这个dll是咱们须要的插件,而后咱们就能够进行插件初始化。插件

若是插件代码须要和主程序通讯,咱们只须要在初始化插件的时候把相关参数传递进去便可。code

void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
{
    QString pluginsPath = pluginsDirPath;
    if (pluginsDirPath.isEmpty())
    {
        pluginsPath = QApplication::applicationDirPath();
    }
    QDir pluginsDir(pluginsPath);
    pluginsDir.cd("Plugins");

    QFileInfoList pluginsFile = pluginsDir.entryInfoList(QStringList() << "*.dll", QDir::Files);
    foreach(QFileInfo fileInfo, pluginsFile)
    {
        QPluginLoader loader(fileInfo.absoluteFilePath());
        bool isLoad = loader.isLoaded();
        QString info = loader.errorString();

        if (QObject * plugin = loader.instance())
        {
            if (PluginInterface * pinterface = dynamic_cast<PluginInterface *>(plugin))
            {
                pinterface->install(PluginParam());//初始化插件
                m_lstPluginInterFace.push_back(pinterface);
            }  
        }
        else
        {
            qDebug() << loader.errorString();
        }
    }
}

上述代码伪代码以下:接口

void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
{
    进入插件路径
    获取路径下全部dll
    foreach(dll集合)
    {
        使用QPluginLoader加载动态库文件
        if (转化为插件接口类)
        {
            初始化插件
        }
    }
}
相关文章
相关标签/搜索