我有2个Qt插件,主要和帮助,main.dll
加载helper.dll
。当main.dll
和QPluginLoader
位于同一文件夹中时,我可以使用main.dll
成功加载helper.dll
。当helper.dll
不存在且我尝试加载main.dll
时会抛出异常。无法找到这个可理解的原因helper.dll
。我的任务是成功捕获抛出的异常,而不是崩溃应用程序。这里调试是Qt Creator显示的内容:
以下代码无法解决问题,因此我需要做其他事情......
std::exception_ptr eptr;
QPluginLoader pluginLoader(packagePath);
try
{
pluginLoader.load();
}
catch(...)
{
eptr = std::current_exception();
}
答案 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帖子中获取了部署脚本,该帖子可以在这里找到: