2016-04-23 22 views
1

我正在用本地C++編寫Windows應用程序插件(作爲DLL)。我們稱之爲myplugin.dll。我的插件引用另一個DLL,我們將其稱爲other.dll由插件DLL引用的DLL的搜索路徑

我的插件是安裝在myplugin子目錄中的應用程序的plugins目錄:

application.exe 
plugins\ 
    myplugin\ 
     myplugin.dll 

myplugin.dll鏈接隱式other.dll。我不能延遲加載other.dll,因爲它公開虛擬方法的類,並且虛擬方法表被視爲數據,它們不能從延遲加載的DLL中導入。

我自然會喜歡的地方other.dllplugins\myplugin目錄,旁邊myplugin.dll,但默認情況下爲other.dllsource)搜索時,Windows會不會看在plugins\myplugin

這裏有什麼我的選擇,除了將other.dll放在應用程序的根目錄?

(雖然Altering DLL search path for static linked DLL這個問題是相關的,但它描述了一個不太合理的場景:應用程序隱式鏈接到插件DLL。我相信一個清晰的典型場景可能有助於揭示其他解決方案常見的問題,如明確加載other.dllmyplugin.dll被應用程序加載,如果這將是可能的)

編輯:另一個類似的問題:Plugin DLLs that depend on other DLLs

編輯:我發現了一個解決問題的方法,請參閱下面接受的答案。據我所知,這是最乾淨的解決方案。我希望它能幫助別人。

+0

如何在PATH上的目錄中找到?您發佈的鏈接完全是這樣說的。 – PaulMcKenzie

+2

可能重複的[改變靜態鏈接DLL的DLL搜索路徑](http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – gdlmx

+1

@PaulMcKenzie感謝您致力於改變PATH是非常具有侵入性的,可能有副作用,並且基本上需要安裝程序(即不再可能實現純粹的「xcopy-deployment」)。 –

回答

1

我在對我的問題的最後一條評論中列出的想法證明是一個好主意。

我將myplugin.dll更改爲簡單的shim DLL。 (使用LoadLibrary)從包含在我的情況墊片,plugins\myplugin\目錄

  1. 它首先加載other.dll:該墊片的入口點執行以下操作。
  2. 然後它從同一目錄加載myplugin-impl.dll,即「真實」插件。

myplugin.dll然後簡單地轉發所有電話到myplugin-impl.dll哪個做實際的工作。

請注意,myplugin-impl.dll仍隱含鏈接到other.dll。但是,當加載myplugin-impl.dll時,other.dll已由應用程序進程的地址空間中的填充程序加載,因此不會發生進一步的加載。使用此解決方案,我們可以獲得隱式DLL加載(特別是使用虛擬方法加載C++類)的好處,同時仍然可以完全控制加載隱式加載的DLL的位置以及如何加載它。