3

このコードを使用してプラグインをロードしようとしました:

QString path = QFileDialog::getOpenFileName(0);
QPluginLoader loader(path);
AnprPluginInterface *i = qobject_cast< AnprPluginInterface* >(loader.instance());
if (i == NULL )
    QMessageBox::information(0, "this", "error loading plugin." + loader.errorString());
else
    QMessageBox::information(0, "this", "plugin loaded.");

プラグインの絶対パスを送信しましたQPluginLoaderが、プラグインが見つからないと表示されます。
エラー:

error loading plugin. "Cannot load library The specified module could not be found." 
4

1 に答える 1

15

プラグインが Q_INTERFACES() マクロを使用して正しいインターフェースをエクスポートしていることは確かですか? エラーが発生した場合は、次の 2 つの点を確認してください。

1) loader.instance() が 0 を返す: その場合、報告されたエラーを調査する必要があります。

2) qobject_cast は 0 を返します。この場合、問題はエクスポートされたインターフェイスの欠落にあると思います。

また、両方の実行パスが同じコードを実行していることを考慮する必要があるため、エラーがまったく発生していない可能性があります...私はこれを参照しています:

if (i == NULL )
    // Reports the error
    QMessageBox::information(0, "this", "error loading plugin." + loader.errorString());
else
    // Hey!? WTF!? Repots the error anyway!?
    QMessageBox::information(0, "this", "error loading plugin." + loader.errorString());

3) 忘れていました: プラグインとアプリケーションの両方が同じ方法 (デバッグ/リリース) でビルドされているかどうかも確認してください。

4) ところで、チェックすべきもう 1 つのことは、プラグインが何らかの依存関係 (たとえば、他の動的ライブラリ) を持っているかどうかです。これは私にも 1 回発生し、DLL が見つからず、プラグインが正しくロードされていないことに気付くまでにかなりの時間を費やしました。

于 2013-07-29T09:50:00.910 に答える