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