1. 程式人生 > >__declspec(dllexport)和__declspec(dllimport)

__declspec(dllexport)和__declspec(dllimport)

1、解決的問題:

  考慮下面的需求,使用一個方法,一個是提供者,一個是使用者,二者之間的介面是標頭檔案。標頭檔案中聲明瞭方法,在提供者那裡方法應該被宣告為__declspec(dllexport),在使用者那裡,方法應該被宣告為__declspec(dllimport)。二者使用同一個標頭檔案,作為介面,怎麼辦呢?

2、解決辦法:

  使用條件編譯:定義一個變數,針對提供者和使用者,設定不同的值。

#ifndef DLL_H_
#define DLL_H_

#ifdef DLLProvider
#define DLL_EXPORT_IMPORT __declspec(dllexport)
#else
#define DLL_EXPORT_IMPORT __declspec(dllimport)
#endif

DLL_EXPORT_IMPORT int add(int ,int);

#endif

__declspec(dllexport)宣告一個匯出函式,是說這個函式要從本DLL匯出。我要給別人用。一般用於dll中省掉在DEF檔案中手工定義匯出哪些函式的一個方法。當然,如果你的DLL裡全是C++的類的話,你無法在DEF裡指定匯出的函式,只能用__declspec(dllexport)匯出類。
__declspec(dllimport)宣告一個匯入函式,是說這個函式是從別的DLL匯入。我要用。一般用於使用某個dll的exe中 不使用 __declspec(dllimport) 也能正確編譯程式碼,但使用 __declspec(dllimport) 使編譯器可以生成更好的程式碼。編譯器之所以能夠生成更好的程式碼,是因為它可以確定函式是否存在於 DLL 中,這使得編譯器可以生成跳過間接定址級別的程式碼,而這些程式碼通常會出現在跨 DLL 邊界的函式呼叫中。但是,必須使用 __declspec(dllimport) 才能匯入 DLL 中使用的變數。