2016-03-21 12 views
2

Qt GUIを含むdllを持っています。これは、GUIが強制終了(アンロード)された後も続行する「サーバー」アプリケーションによって起動されます。すべてのqt dllをアンロード

すべて正常に動作しますが、GUIを再起動してもすべてがクラッシュします。 Qt5Core、Qt5Gui、およびqwindows.dllが一度だけ実行され、ロードされたdllをリストすると、アンロードされません。

私はWindows 7でmsvc2010コンパイラを使用していて、何のログ(「一般保護違反」ではないではありません

(私のDLLが適切に破壊され、専用のスレッドではQApplicationを作成する)私はそれらをアンロードする必要があると思います私のためのログ)。

すべてのqt dll(Qtcore、QtGui、qwindows)をアンロードするソリューションはありますか? (明示的に "FreeLibrary"関数を呼び出さずに)

+0

FreeLibraryを呼び出さずに.dllをアンロードする方法を教えてください。 –

+0

Qt dll(コアなど)が明示的にロードされていないため、私自身のdllをロード(および解放)します。 – Loy

+0

Qtを 'FreeLibrary'でアンロードしたいなら、' LoadLibrary'でロードする必要があります。 DLLの遅延ロードについて読む。 –

答えて

0

GetModuleHandle( "dllname")を使用して解決されたハンドルを取得し、freelibraryを使用できます。今ではうまく動作します(しかし本当に "動的"ではありません... Qtはデバッグとリリースで異なる名前を使用し、別のDLLが "浮動"している場合はコードを変更する必要があります)

ありがとうございました!

+0

アンロードしたDLLの順序を投稿しますか? – Ohad

+0

申し訳ありません、私は正しく説明しませんでした:PoCのために、私はちょうどすべてのDLLをロードし、名前で "Qt5"を探し、各モジュールのwhileループで "freelibrary" 。この(醜い)方法は、2回または3回の放電と再ロードで動作しますが、その後はOSが正しく解放されずクラッシュします。これは展開のために「本当に」解決されていません.../ – Loy

1

私は最近、同じ問題についてQt社のサポートチケットを作成し、期待外れの返答を受けました。アプリケーションが終了するまで、Qtプラグインをロードしたままにする意識的な意思決定がありました。結果として、非Qtホストアプリケーション用に設計された多くのQtベースのプラグインは、適切な操作を保証するために脆弱な回避策に頼らざるを得ません。

さまざまなQt DLLをアンロードするとき、DLLの多くがお互いに依存するため、アンロードの順序が重要です。ここで私はQtのサポートエンジニアから受信した正確な応答は次のとおりです。

プラグインが故意にアンロードされていないが プラグインをアンロードすると、過去に問題があっしたがって、それは彼らが合意されたように、アプリケーション が終了するまでアプリケーションの有効期間が になるようにしておく必要があります。あなた自身のdllをアンロードする前に、まずプラグインをアンロードして にする必要があります。プラグインはお互いに依存しないので の注文でアンロードすることができます。メインプラットフォーム one - qwindows.dllが イベントを処理している主要なものとなります。したがって、QApplicationがもはやイベントループである を実行していない限り、これを安全にアンロードすることができます。 Qt dllの前にプラグインをアンロードすると、 プラグインはまだロードされているQt dllで処理されますので、 はクラッシュしません。

+0

返信ありがとう!私の(hypothetic)ソリューションは、独立したプロセスを作成し、パイプや他の方法でコマンドを実行し、 'クライアント'プロセスを終了します。それは醜いです(リアルタイム禁止されていますか?)、セキュリティ上の問題が発生しますが、他の解決策はありません... – Loy

関連する問題