2011-11-30 67 views
0

我想能夠存儲在子文件夾中的DLL沒有EXE抱怨缺少的DLL。如何讓EXE查看子文件夾,例如「DLL」?如果這與它有什麼關係,我的IDE是Code :: Blocks。如何讓C++程序查找DLL?

+0

您可以將文件夾添加到您的PATH – Cyclonecode

+0

我希望能夠將文件夾分發到其他計算機而無需設置其路徑。 – Ripspace

+1

然後將其放在與* .exe相同的目錄中,請參閱:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx – PeterT

回答

2

使顯式加載(LoadLibrary/GetProcAddress)的這項工作很容易。您正在控制綁定過程,並將完整路徑傳遞給LoadLibrary。

對於隱式加載,您處於系統的擺佈之中。雖然你可以增加PATH變量,但這是非常嚴格的。面對將所有DLL放在可執行文件或修改PATH的選擇,我總是會選擇前者。

還有DLL redirection的選項,但即使是微軟似乎也建議你將DLL放在可執行文件旁邊,而不是使用重定向。

+0

謝謝!現在我可以保持我的文件夾整齊。但是,加載速度稍慢。這可能是爲什麼他們建議把dll放在EXE旁邊。 – Ripspace

+0

可執行建議旁邊的DLL是出於安全原因。 –

2

有些方法可以通過清單或重定向來做到這一點,但這些都很複雜。

我建議而是使用的結構如下:

myapp.exe 
DLLs/ 
    myapp_internal.exe 
    mydll1.dll 
    mydll2.dll 

在上面的例子中你的實際應用是myapp_internal.exe,並且它會在DLL中的子文件夾,以便所有的DLL可以正確定位。 myapp.exe二進制文件只是一個存根應用程序,它執行myapp_internal.exe

我希望這有助於!

+0

這是一個非常聰明的想法,它應該適合我。 – Vladivarius

0

我其實沒有嘗試過這個,但是沒有理由不應該這樣做(着名的遺言)。

  1. 打開延遲加載您的DLL。這是通過一個linker option or compiler #pragma.
  2. 在代碼的早期(在調用任何DLL函數之前),修改PATH環境變量的進程副本以包含DLL目錄。這將使進程能夠找到DLL,但不會影響系統PATH變量。

如果您真的想使用LoadLibrary/GetProcAddress,請自己幫忙,並使用wrapper library來簡化它們的使用。