2016-03-03 266 views
4

我有2个Qt插件,main和helper,加载helper.dll。当main.dllhelper.dll位于同一文件夹中时,我可以成功加载main.dllQPluginLoader。当helper.dll不存在,并且我尝试加载main.dll时会抛出异常。这是可以理解的原因helper.dll找不到。我的任务是成功捕获抛出的异常,而不是崩溃应用程序。虽然这里的调试是什么Qt Creator中显示:处理由QPluginLoader :: load()抛出的异常:

enter image description here

下面的代码是不是解决这个问题,所以我需要做些别的事情...

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

我想你在main.dll中找不到helper.dll或者没有找到这个异常?你如何加载helper.dll?以某种方式使用Qt框架或...? – Radek

+0

@Radek,我没有抛出异常。我调用QPluginLoader的instance()的时候就是抛出异常的东西。我无法抓住它,因此我的应用程序崩溃。我加载main.dll,但main.dll内部使用helper.dll。 – armanali

+0

它是有道理的,因为AFAIK Qt不会引发异常。比'load()'返回的布尔值更有趣。我认为这个问题将在加载helper.dll的main.dll的一部分。对我来说,它看起来像是OS API的一个例外,因为你无法捕捉它,这很奇怪。 – Radek

回答

0

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

这里是我的代码如下所示:

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); 
} 

我把部署脚本从另一个#1可在这里找到的帖子:

Automatic Copy of Dependent Files in Qt Creator

+0

这很有趣。这意味着你需要复制另一个DLL的路径。当我在一年前写了一些插件时,我不记得我需要这样做。 – Radek

+0

@armanali难道你没有要求的条件pluginLoader.load();抛出?在这种情况下,您自己的代码不能成为解决方案。 – Matteo

1

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

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

这种异常将让你捕捉SEH错误,你可以找到详细的文章MSDN一下: https://msdn.microsoft.com/en-us/library/swezty51.aspx


此外,但这是另一个话题,为了正常终止,你也可以使用SetUnhandledExceptionFilter

+0

我没有读到关于__try和__except的内容。出于某种原因,我无法在Qt创建器中编译该代码,即使我已经包含了来自Microsoft和STL的所有必需头文件。你可以用Qt创建器试试它,编译并发布代码吗?谢谢!! – armanali