2011-07-05 5 views
1

私は(外国の)C++ホスト内で実行されているC++ DLLであるプラグインアプリケーションを持っています。 プラグインのオンラインアップデートを許可します。 どうすればいいですか?DLLアプリケーションのオンラインアップデート

可能な方法の1つは、DLLをラッパーDLLとコンテンツDLLに分割し、 を使用して各更新時に新しいコンテンツDLLに移動することです。

これを実現する方法はありますか?あなたがホストを制御することはできません場合は

おかげ

+0

別のdllに移動すると、アンロードしてから再度ロードする必要があります。したがって、コンテンツdllをアンロードする必要があるため、あなたが提案する分離は実際には何も解決しません。 – stijn

答えて

0

は、あなたは、動的ロード/アンロード自分で行う必要があります。あなたが正しく気づいたので、これのために2つのDLLが必要になります。これはおそらく最も簡単な方法ですが、DLLを交換している間はホストが害を及ぼすことがないようにする必要があります。最も簡単な解決策は、おそらく両方のDLLを読み込んだ後、古いコードをアンロードする前にそれらの間でアトミックな切り替えを実行することです。

0

一つの問題は、/リロードプラグインを再起動するホストアプリケーションを取得する方法、それは別のものを使用してDLLを置き換えるために取得する方法です。 Windowsでは

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

したがって、あなたはその後、最初にあなたのDLLをアンロード、それを交換し、再びそれをロードするよりも、他の選択肢を持っていません。これはあなたが説明したように行うことができます。

ホストアプリケーションで許可されている場合は、第2の独立プラグインを作成して、アプリケーションに更新対象のアプリケーションをアンロードするように指示し、それを更新してから、 - それをロードします。

0

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

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

関連する問題