Qt插件熱加載-QPluginLoader實現


上一篇C++消息框架-基於sigslot文章中我們講述了使用sigslot信號槽實現自己的消息框架,這是一個比較粗糙,而且小的框架。當我們的程序逐漸變大時,我們可能就會考慮功能插件化,或者支持某些模塊動態加載和卸載。

功能動態加載,也就是我們平時所說的插件化,插件支持熱插拔。

之前工作中,剛好接觸過這一塊的內容。下面是一個Qt加載dll的方式,當我們把dll加載上以后,可以嘗試轉化為PluginInterface接口,如果可以轉換成功,則說明我們這個dll是我們需要的插件,然后我們就可以進行插件初始化。

如果插件代碼需要和主程序通信,我們只需要在初始化插件的時候把相關參數傳遞進去即可。

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 (轉化為插件接口類)
        {
            初始化插件
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM