2012-02-17 33 views
1

私は達成しようとしている作業はかなり簡単ですが、まだ問題にぶつかっています。Qt:dllの読み込みに失敗した場合の別のシナリオ

私は自分のプログラムの一部として2回サブクラス化しているベースクラス(ヘッダーとソースファイル内にあります)を持っています。それはWorkerBaseと呼ばれます。サブクラスWorkerAの1つはかなり些細なものですが、もう1つはWorkerBです。これはプログラムが実行されているハードウェアに依存するサードパーティのライブラリに依存しています。ハードウェアが不適切であるか、それらのライブラリが欠落している場合、そのサブクラスを使用すると失敗します。この場合、WorkerAを使用します。

基本的に、ライブラリの読み込みに失敗した場合はどうすれば検出できますか?ライブラリがない場合、メインプログラムは起動しません。

私はQtを使用しています。プログラムはWindowsのみになります。ありがとうございました。

答えて

1

私が考える最も簡単な解決策は、Wokerをプラグインに移動することです。

実行時にQPluginLoaderというプラグインを動的にロードできます。

その後、WorkerB静的WorkerBのために必要な依存関係が満たされないならば、WorkerBプラグインは単にロードに失敗します、サードパーティ製のlibにに連結される一方で、あなたの代わりにQPluginLoaderと負荷WorkerAプラグインでそれをキャッチします。

ホイール独自のプラグインシステムQLibrary(およびQPluginLoaderを参照実装として使用)を再作成することです。

0

おそらくそれは、ライブラリをロードすると、ライブラリが正常にロードされた場合はtrueを返し

http://developer.qt.nokia.com/doc/qt-4.8/qlibrary.html

bool QLibrary::load() 

に役立ちます。それ以外の場合はfalseを返します。 resolve()はシンボルを解決する前にこの関数を呼び出すので、明示的に呼び出す必要はありません。状況によっては、ライブラリを事前に読み込みたい場合があります。その場合は、この関数を使用します。

+0

試してみましたが、助けになりませんでした。プログラムはコンパイル時にライブラリ(.a)とリンクし、実行時には.dllが必要です。私がそれをリンクしないと、多くの「未定義の参照」エラーが発生します。おそらく、私は間違ったことをしています。 –

+0

ああ、コンパイル時にリンクする。あなたはそれをテストして例外をキャッチしようとすることができます。 –

+0

または、どういうわけか、コンパイル時のリンクを取り除くことができます。しかし、どのように 'WorkerB'を使うのですか? –

関連する問題