1

(外部の)C++ホスト内で実行されているC++DLLであるプラグインアプリケーションがあります。プラグインのオンライン更新を許可したい。どうやってやるの?

考えられる1つの方法は、DLLをラッパーDLLとコンテンツDLLに分離し、更新のたびに新しいコンテンツDLLに移動することです。

それを達成するためのより良い方法はありますか?

ありがとう

4

3 に答える 3

0

問題の 1 つは、ホスト アプリケーションにプラグインを再起動/リロードさせる方法と、DLL を別のものに置き換える方法です。

Windows(DLLと言ったのでWindowsを想定)では、メモリにロードされている間に実行可能イメージ(DLLを含む)を別のものに置き換えることができない限り、問題があります。POSIX では問題ありませんが (これは副作用もなく確実に動作します!)、Windows は排他的アクセスのためにイメージをロックします。

したがって、最初に DLL をアンロードしてから置き換え、再度ロードする以外に選択肢はありません。これは、あなたが説明したように行うことができます。

ホスト アプリケーションがそれを許可する場合の 1 つの代替方法は、更新するプラグインをアンロードするようにアプリケーションに指示し、それを更新してから、ホスト アプリケーションに再ロードするように指示する2 番目の独立したプラグインを作成することです。

于 2011-07-05T13:38:54.343 に答える
0

はい、使用中の DLL を直接更新することはできません。2 つの DLL を使用したソリューションは機能しますが、洗練されている可能性があります。少なくとも、アプリケーションの実行中に新しい DLL をアンロードしてロードすることはしません。次回プラグインをロードするときに、新しい DLL をダウンロードしてロードします。

また、自動起動フォルダーにある EXE (および 2 番目の DLL ではない) のアップデーターを使用することもできます。更新がある場合はファイルをダウンロードし、正しい場所にコピーします。ERROR_ACCESS_DENIED が原因で失敗した場合、ユーザーは既にアプリケーションを起動しており、次回ユーザーがログオンしたときに更新によってコピーが行われます。これは簡単で、十分であり (決定する必要があります)、ユーザーにとって透過的であると思います。自動開始フォルダーから更新を削除するか、手動で開始することができます。

于 2011-07-05T15:25:37.787 に答える
0

ホストを制御できない場合は、動的なロード/アンロードを自分で行う必要があります。お気づきのとおり、これには 2 つの DLL が必要です。これがおそらく最も簡単な方法ですが、DLL の交換中にホストが害を及ぼさないようにする必要があります。おそらく最も簡単な解決策は、両方の DLL をロードしてから、古いコードをアンロードする前にそれらの間でアトミック スイッチを実行することです。

于 2011-07-05T13:34:45.430 に答える