处理QPluginLoader :: load()

时间:2016-03-03 23:59:58

标签: c++ qt dll plugins qt5

我有2个Qt插件,主要和帮助,main.dll加载helper.dll。当main.dllQPluginLoader位于同一文件夹中时,我可以使用main.dll成功加载helper.dll。当helper.dll不存在且我尝试加载main.dll时会抛出异常。无法找到这个可理解的原因helper.dll。我的任务是成功捕获抛出的异常,而不是崩溃应用程序。这里调试是Qt Creator显示的内容:

enter image description here

以下代码无法解决问题,因此我需要做其他事情......

std::exception_ptr eptr;
QPluginLoader pluginLoader(packagePath);
try
{
    pluginLoader.load();
}
catch(...)
{
    eptr = std::current_exception();
}

2 个答案:

答案 0 :(得分:1)

我相信在这种情况下你应该使用Windows __try / __except扩展名:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

这种异常会让你抓住SEH错误,你可以在MSDN上找到一篇关于它的详细文章: https://msdn.microsoft.com/en-us/library/swezty51.aspx

此外,但这是另一个主题,为了优雅地终止你也可以使用SetUnhandledExceptionFilter

答案 1 :(得分:0)

我能够解决这个问题。问题是我的Qt应用程序没有自行部署(Qt应用程序需要独立于Qt创建者运行时必须执行的操作。我将脚本添加到Qt Creator项目的.pro文件中。一旦我做了我没有看到崩溃,但是如果对QPluginLoader::errrorString()的调用返回false,则通过调用QPluginLoader::load()生成友好的错误消息。

以下是我的代码:

QPluginLoader pluginLoader(m_packagePath);

bool bLoaded = pluginLoader.load();
if (bLoaded)
{
    QObject* plugin = pluginLoader.instance();
    m_metaObject = plugin->metaObject();
    if (m_metaObject == nullptr)
    {
        qCritical() << "Unable to obtain entry class of input plugin. Please check your plugin.";
        return false;
    }
}
else
{
    qCritical() << "Message from Qt plugin loader:";
    qCritical() << pluginLoader.errorString();
    qCritical() << "Please make sure your input Qt plugin along with its dependencies are deployed with winqtdeploy.exe and in the same folder as your plugin.";
    exit(-1);
}

我从另一个Stackoverflow帖子中获取了部署脚本,该帖子可以在这里找到:

Automatic Copy of Dependent Files in Qt Creator