QPluginLoader::load() によってスローされた例外の処理



main.dll のメインとヘルパーの 2 つの Qt プラグインがあります。 helper.dll を読み込んでいます . main.dll を正常にロードできました QPluginLoadermain.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();
}

答え:


私はこれを解決することができました。問題は、私の Qt アプリケーションがそれ自体をデプロイしていなかったことです (Qt 作成者から独立して実行する必要がある場合に、Qt アプリケーションが実行しなければならないことです。 .pro にスクリプトを追加しました)。 Qt Creator プロジェクトのファイル。これを実行すると、クラッシュは発生しませんが、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);
}

ここで見つけることができる別の Stackoverflow 投稿からデプロイ スクリプトを取得しました:


Qt Creator での依存ファイルの自動コピー