dllexport 與 dllimport 的區別

dllexportdllimport 是一種位置的描述子。表示說這個被描述的宣告,它的真實定義是被放在我的 Module 裡的 obj file 呢? 還是被放在另外的 dll 裡。

dllexport

當你的 function 宣告, global 變數, 或是 class 定義,被加上了 __declspec(dllexport) 此描述子表示兩件事

  1. 你是 DLL Module,你一定要提供該 function 的實作、該 global 變數的實際定義、以及該 class 的各個 method 實作。保證這些實作與定義會存在 此 DLL Module 底下的某一個 .c/.cpp 檔。

  2. 你要這些被描述的宣告,記錄成 DLL 的介面,儲存在 Binary 的 Export 表裡。

dllimport

同樣的,若是 dllexport 換成 dllimort 的話,則代表。

  1. 該 function 實作/global 變數/class methods 的定義,是放在別人家裡,不會在自己的 Module 裡。有一點類似 extern 代表此變數可能是被定義在別的 file,而 dllimport 則是擴展到 binary 的層級。

發佈的 Header

DLL Module 通常都會發布一份共用的 Header ,來描述說我有哪些的 function/global variable/class,可以從我這裡提供。然而這份 Header,DLL-Side 會用,Client-Side 也會用。但是他們的描述子一定要有區別。

所以就會有了下列的的通俗用法:

#ifdef MYDLL_EXPORT
#define MYDLLAPI    __declspec(dllexport)
#else
#define MYDLLAPI    __declspec(dllimport)
#endif

MYDLLAPI int add(int a, int b);

class MYDLLAPI Adder
{public:
    int add(int a, int b);
};

開一個 MYDLLAPI Define 來描述任何要 export 的物件。不管是 Dll-Side 或是 Client-sie* 都用 MYDLLAPI 來解釋這些物件的位置。

只要 DLL Module 在自己的 PREPROCESSOR 定好 MYDLL_EXPORT 當作開關,表示:

  • 有此 Define 的 Module 才是實作的提供者。 (__dllexport)
  • 其他沒 Define 就是一般的 Client。 (__dllimport)。
comments powered by Disqus