2011-07-05 42 views
1

我有一個插件應用程序,它是在(外國)C++主機內運行的C++ DLL。 我想允許在線更新插件。 我該怎麼做?在線更新DLL應用程序

一種可能的方法是將DLL分離爲包裝DLL和內容DLL,並在每次更新時移動到新的內容DLL。

有沒有更好的方法來實現呢?

感謝

+0

移動到另一個DLL意味着你將不得不卸載它,然後再次加載它。因此,你提出的分離不會真正解決任何問題,因爲你仍然需要卸載內容的DLL。 – stijn

回答

0

如果你有超過主機無法控制,那麼你所要做的動態加載/卸載你自己的。正如你正確地注意到的,你將需要兩個DLL。這可能是最簡單的方法,但是您需要確保主機在交換DLL時不會造成任何傷害。最簡單的解決方案可能是加載兩個DLL,然後在卸載舊代碼之前在它們之間執行原子切換。

0

一個問題是如何讓主機應用程序重新啓動/重新加載插件,以及如何讓它替換您的DLL與另一個。

在Windows下(假設Windows,因爲你說的是​​DLL),你有一個問題,因爲你無法用加載到內存的另一個可執行映像替換可執行映像(這包括DLL)。在POSIX下,這將是沒有問題的(這甚至可以在沒有任何副作用的情況下可靠運行!),但是Windows將鎖定圖像以進行獨佔訪問。

因此,除了首先卸載DLL,然後將其替換並重新加載,您別無選擇。這可以按照你所描述的完成。

如果主機應用程序允許的話,另一種方法是編寫一個獨立的插件,它告訴應用程序卸載待更新的插件,然後更新它,然後告訴主機應用程序重新啓動加載它。

0

是的,你不能直接更新使用的DLL。有兩個DLL的解決方案可行,但可能很複雜。至少我不會在應用程序運行時卸載並加載新的DLL。在下次加載插件時,下載並加載新的DLL。

此外,你可以讓你的更新程序是一個EXE(並沒有第二個DLL),它是在自動啓動文件夾中。如果有更新,它會下載文件並將其複製到正確的位置。如果由於ERROR_ACCESS_DENIED而導致失敗,則用戶已經啓動應用程序,並且您的更新將在用戶下次登錄時執行復制。 我認爲這更容易,足夠(你必須決定)並且對用戶透明 - 他可以從自動啓動文件夾中刪除更新或手動啓動它。