2012-04-19 23 views

回答

17

__declspec(dllexport)導出符號。它使它可以從DLL之外使用。

__declspec(dllimport)導入一個符號。它實際上說「這個符號沒有在這個應用程序中定義,它需要從DLL文件導入」。

您不必聲明它與extern "C"。如果您不使用extern "C",那麼該符號將以C++符號的形式導出,並且只能從C++(以及支持調用C++ DLL的語言)調用該符號。如果您使用extern "C",那麼該符號將以C符號的形式導出,您將可以從支持調用C DLL的語言中調用該符號。

如果您想在C#中使用您的DLL,您將需要使用extern "C"

這裏是一個很好的教程,向您展示如何在C#中使用C++ DLL:How to marshal a C++ class。我在許多項目中使用瞭解決方案A.

另外,這裏是關於如何在另一個C++應用程序中使用C++ DLL的簡短教程:How to create and use DLL in C++

7

否 - dllexport意味着您從DLL(或從可執行文件)導出它,以便其他模塊(DLL或可執行文件)可以使用該函數。

dllimport用於聲明在DLL(或者,再次,可執行文件)中實現的函數。

因此,在一般情況下,你必須是這樣的:

#ifdef BUILDDLL 
#define DLL declspec(dllexport) 
#else 
#define DLL declspec(dllimport) 
#endif 

然後每個公共函數的DLL將被標記爲DLL

DLL int dosomething(int); 

然後,當你構建DLL,您將定義BUILDDLL,將所有這些函數標記爲dllexport。否則,您將在需要使用函數的客戶端代碼中包含相同的頭文件。它不會定義BUILDDLL,所以它們全部被標記爲dllimport,所以當涉及到鏈接時,它會創建一個到該DLL的鏈接,而不是試圖從某個地方像標準庫那樣滿足這些函數。

+0

dllimport是用來聲明一個在DLL中實現的函數嗎,這個DLLimport的用途是什麼? – Naruto 2012-04-19 06:29:46

+0

@LLL:它讓編譯器知道它來自DLL。來自DLL的函數總是通過指針調用,因此編譯器必須知道足夠的信息才能生成該函數。 – 2012-04-19 06:33:21

+3

@LLL假設您製作了兩個項目:MyDLL和MyApp。您在MYDLL定義一個函數,並導入MYDLL.DLL文件到MyApp.exe的,並從那裏調用該函數。你需要使用''在MYDLL項目__declspec(dllexport)的(標記要導出的功能,而你需要使用'__declspec(dllimport的)'MyApp項目中,從DLL。 – Ove 2012-04-19 06:37:01

0

這也意味着條目(以靜態導入和導出表格的形式)在exe文件中創建(通過鏈接器),dll..files,它記錄了提供者和消費者之間的依賴關係。