2011-12-22 70 views
0

這個問題是關於庫的動態鏈接和應用程序中庫的動態鏈接的使用。關於C++中的動態鏈接庫

例如,我們使用Visual Studio環境使用C++開發應用程序。

這裏包含頭文件我們其他指定包含目錄,並在附加依賴 :Mylibrary.lib 在附加庫目錄:我們指定庫

,並在Windows,我們也有路徑「調用LoadLibrary」 API用於加載動態鏈接的庫。

我的問題是

  1. 當我們包括其他的依賴庫DLL爲什麼我們應該使用「調用LoadLibrary」 API?
  2. 什麼時候應該使用「LoadLibrary」API?

謝謝!

回答

0

想象一下,您有一個軟件,例如在確定的時間需要needes將 Internet網絡地址轉換爲字符串。 在Windows vista或更高版本中,您可以使用也可以處理ipv6的「InetNtop」功能,但是如果直接鏈接到DLL,您的程序將無法在較低的操作系統上運行(例如:Windows XP)。 所以最好的解決方案可能是讓2個DLL使用「InetNtop」,另一個使用例如「inet_ntoa」。 然後,根據他安裝的操作系統,您的「主」程序將在運行時執行「InetNtop DLL」的LoadLibrary或「inet_ntoa DLL」。

2

LoadLibrary如果dll不在正在運行的機器上,讓您繼續執行程序。它返回一個錯誤狀態,可以檢查並繼續執行。

此外,鏈接可以讓你做其他二進制&其他使用類的東西。 LoadLibrary只允許您通過GetProcAddress查找功能。

+0

其實,還有第三個選項(我真的不建議):延遲加載。有了這個,你可以像使用lib文件一樣正常使用dll,但是在加載時不需要,但是在第一次訪問時不需要。由於這是由編譯器隱式完成的(據我所知),它有點隱藏並導致難以調試的錯誤。有關更多信息,請參閱http://msdn.microsoft.com/en-us/library/151kt790.aspx。 – 2011-12-22 11:50:04

0

你問過你可以在其他依賴庫中包含dll,然後爲什麼要使用loadlibrary。

首先讓清晰的認識:

雖然靜態鏈接,程序員需要到的.lib文件添加到 附加庫的依賴,這是與在編譯時主調程序,

然而,Dll是動態加載的,因此當您使用LoadLibrary ie時,您不需要在其他庫依賴項中添加dll;如果您明確地鏈接了Dll,則不需要在其他庫依賴項中提供您的dll路徑。

請注意:使用LoadLibrary的 您將能夠獲取Dll句柄,您可以使用GetProcAddress調用導出的函數。

參考: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx