2013-07-29 52 views
8

http://msdn.microsoft.com/en-us/library/9h658af8.aspx__declspec(dllimport的)如何加載庫

MSDN說,我可以從庫導出函數__declspec(dllexport)但我怎麼能在我的可執行文件加載這個庫?

我有在DLL導出函數:

__declspec(dllexport) void myfunc(){} 

現在,我想在我的可執行文件使用它:

__declspec(dllimport) void myfunc(void); 

但我的程序怎麼會知道在哪裏可以找到這種功能?

+4

看一看:http://stackoverflow.com/questions/538134/exporting-functions-from-a-dll-with-dllexport –

+3

這是達不到你的程序。由操作系統來查找您需要的DLL。你可以給它一個非常難的時間這樣做,但沒有必要這樣做。確保該DLL與EXE位於同一目錄中,並且可以順利進行。 –

回答

7

這是編譯器/連接器的工作,它會自動只要照你

  1. 包含在鏈接選項的.lib
  2. 在運行時提供的DLL,以便它是由EXE發現

.lib文件是在編譯該DLL時生成的,或者如果它不是您的代碼,則會隨附它。在這種情況下,代碼編譯爲__declspec(dllexport)

編譯你的exe文件時,編譯器會發現包含的函數在DLL中。在這種情況下,代碼編譯爲__declspec(dllimpport)

鏈接器提供了.lib文件,並在exe中生成相應的指令。

這些指令將使Exe在運行時找到DLL並加載導出的函數。該DLL只需要在Exe旁邊(但是還有其他可能的地方)。

__declspec(dllimpport)__declspec(dllexport)之間的切換由宏provided by Visual C++ when creating a DLL project完成。

+0

如何在運行時提供DLL? – deepspace

+0

@deepspace看到我的編輯,它只是在旁邊的exe – CharlesB

1

您的操作系統將能夠根據鏈接過程找到它。如果您的庫正確鏈接到您的程序,它會識別出正在使用外部函數,並在dll路徑中查找它。如果它找不到它,鏈接器將會拋出一個錯誤。

我建議讀一下連接過程;它有時可能會讓人困惑,但理解它可以幫助您掌握C/C++中的一些關鍵概念。

1

如果您使用的是DLL,您可以使用LoadLibraryGetProcAddress組合。

//Load the DLL 
HMODULE lib = LoadLibrary("testing.dll"); 

//Create the function 
typedef void (*FNPTR)(); 
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc"); 

//EDIT: For additional safety, check to see if it loaded 
if (!myfunc) { 
    //ERROR. Handle it. 
} 

//Call it! 
myfunc(); 
+0

是__declspec(dllimpport)的替代? – pasha