VC 編譯器 dll匯入匯出 MSDN摘抄

2021-06-14 20:08:04 字數 2029 閱讀 3292

內容選擇vc2008 的 msdn文件,摘錄在此。

1.  可以使用兩種方法將公共符號匯入到應用程式中或從 dll 匯出函式:

模組定義 (.def) 檔案是包含乙個或多個描述 dll 各種屬性的 module 語句的文字檔案。如果不使用__declspec(dllimport)__declspec(dllexport)匯出 dll 函式,                    則 dll 需要 .def 檔案。

可以使用 .def 檔案匯入到應用程式中或從 dll 匯出。

visual c++ 用__declspec(dllimport)__declspec(dllexport)取代以前在 16 位版的 visual c++ 中使用的__export關鍵字。

不使用__declspec(dllimport)也能正確編譯**,但使用__declspec(dllimport)使編譯器可以生成更好的**。編譯器之所以能夠生成更好的**,是因為它可以確定函式是否存在於 dll 中,這使得編譯器可以生成跳過間接定址級別的**,而這些**通常會出現在跨 dll 邊界的函式呼叫中。但是,必須使用__declspec(dllimport)才能匯入 dll 中使用的變數。

如果有正確的 .def 檔案 exports 節,則不需要__declspec(dllexport)。新增__declspec(dllexport)是為了提供不使用 .def 檔案從 .exe 或 .dll 檔案匯出函式的簡單方法。

win32 可移植可執行檔案格式旨在最小化為修改匯入而必須訪問的頁數。為此,它將所有程式的所有匯入位址都放在乙個稱為「匯入位址表」的位置。這使得引導程式在訪問這些匯入時可以只修改一兩頁。

1 使用 __declspec(dllexport) 從 dll 匯出

若要匯出函式,__declspec(dllexport)關鍵字必須出現在呼叫約定關鍵字的左邊(如果指定了關鍵字)。例如:

__declspec(dllexport) void __cdecl function1(void);

若要匯出類中的所有公共資料成員和成員函式,關鍵字必須出現在類名的左邊,如下所示:

class __declspec(dllexport) cexampleexport : public cobject

;

2.使用  __declspec(dllimport) 從 dll 匯入  與1 類似3   匯出 c++ 函式,使得 c 語言可執行檔案能夠呼叫

如果在用 c++ 編寫的 dll 中,有希望從 c 語言模組訪問的函式,應使用 c 鏈結而不是 c++ 鏈結來宣告這些函式。

extern "c" __declspec( dllexport ) int myfunc(long parm1);
4  匯出 c 函式以用於 c 或 c++ 語言可執行檔案

如果在用 c 編寫的 dll 中有希望從 c 語言或 c++ 語言模組訪問的函式,則應使用 

__cplusplus預處理器巨集確定正在編譯的語言,然後,如果是從 c++ 語言模組使用,則用 c 鏈結宣告這些函式。如果使用此技術並為 dll 提供標頭檔案,則這些函式可以原封不動地由 c 和 c++ 使用者使用。

以下**演示可由 c 和 c++ 客戶端應用程式使用的標頭檔案:

VC編譯器設定

工欲善其事,必先利其器 要想用 vc開發出高效率程式,必須對 vc編譯器有充分的了解。如果我們已經習慣編譯器給我的預設設定,那麼現在起開始嘗試改變吧 本篇文章 或者後續文章 講解 vc編譯器設定選項並沒有先後順序,只是作者在具體開發過程碰見了不同的編譯設定,進行深入了解,做此文章記錄。也希望讀到這篇...

VC編譯器設定

工欲善其事,必先利其器 要想用 vc開發出高效率程式,必須對 vc編譯器有充分的了解。如果我們已經習慣編譯器給我的預設設定,那麼現在起開始嘗試改變吧 本篇文章 或者後續文章 講解 vc編譯器設定選項並沒有先後順序,只是作者在具體開發過程碰見了不同的編譯設定,進行深入了解,做此文章記錄。也希望讀到這篇...

VC編譯器選項

cl.exe 是控制 microsoft c 和 c 編譯器與鏈結器的 32 位工具。編譯器產生通用物件檔案格式 coff 物件 obj 檔案。鏈結器產生可執行檔案 exe 或動態鏈結庫檔案 dll 注意,所有編譯器選項都區分大小寫。若要編譯但不鏈結,請使用 c。使用 nmake 生成輸出檔案。使用...