dll程式設計學習
首先要知道,在vc++6.0環境中,在c呼叫約定和c編譯環境下使用_declspec(dllexport)關鍵字可以匯出不帶任何修飾符的函式名。
dll函式的約定有兩種:呼叫約定和函式名修飾約定。
呼叫約定又分為:_stdcall呼叫約定, _cdecl(c呼叫約定)和_fastcall呼叫約定。
vc++6.0環境預設的呼叫約定為_cdecl,即c呼叫約定。你可以通過選單選項:
工程-->設定-->c/c++-->在「分類」中選擇」codegeneration」下可以看到」calling convention」下的預設設定為」_cdecl」。
下面我們新建乙個win32 dll 空工程:新增兩個mydll.cpp和mydll.h檔案
內容#include "mydll.h"
int max(int a, int b)
return(a>b)? a:b;
int min(int a, int b)
return(a>b)? b:a;
內容#ifndef _my_dll_h_
#define _my_dll_h_
#if defined __cplusplus
extern "c"
#endif
_declspec(dllexport)int max(int a, int b);
_declspec(dllexport)int min(int a, int b);
#if defined __cplusplus
#endif
#endif
如下圖所示:
之後編譯鏈結,無錯誤,這樣乙個動態鏈結庫就生成成功了。
回到工程的debug目錄下就可以看到乙個.dll動態鏈結庫檔案和乙個以.lib為字尾的dll的映像檔案。.lib檔案在動態鏈結庫進行隱式鏈結時會用到,它會被當作.dll的替代檔案被編譯到應用程式中。
下面再來詳細說說mydll.h檔案中的**的含義:
開頭兩行和最後一行都是為了防止標頭檔案被重包含的預編譯指令。
#if defined __cplusplus
extern "c"
#endif
和#if defined __cplusplus
#endif
意思是如果編譯環境是c++環境時,即如果定義了__cplusplus(注意前面是兩個下劃線)。就執行extern 「c」{},告訴編譯器要在c環境下編譯下面的**。前面說過,只有在c編譯環境和c呼叫約定下才能匯出不帶任何修飾的函式名。然後在這之間的就是匯出函式的宣告部分了,如
_declspec(dllexport) int max(int a, int b);//這裡省略了函式約定關鍵字
關鍵字_declspec(dllexport)說明是匯出函式,匯入函式的關鍵字是_declspec(dllimport)。
當然了,如果你不怕麻煩,也可以這樣寫:
_declspec(dllexport) int _cdecl max(int a, intb);
函式呼叫約定可以通過選單設定,也可以通過**進行設定。如果你通過選單設定的呼叫約和你用**設定的呼叫約定不同,則以**設定的為準。
現在你就可以在其他的應用程式中呼叫該動態鏈結庫了,我們在之後的部分再講。
下面我們可以用vc++6.0給我們提供的工具depends.exe來檢視我們生成的.dll檔案匯出的函式了。在你的vc++6.0的安裝目錄的tools目錄下找到depends.exe工具
可以看到匯出的函式名為max和min,不帶任何的修飾符。
現在我們再回到dll的工程中將原始檔mydll.cpp中的extern 「c」去掉(這樣的編譯環境就是c++了),或者將呼叫約定改為_stdcall(去掉源**中匯出函式宣告前的_cdecl關鍵字,通過工程設定呼叫約定為_stdcall。或將該關鍵字改為_stdcall),再編譯連線。下面是去掉extern 「c」的結果。用depends.exe開啟.dll檔案可以看到匯出的函式識別符號就多了很多修飾符了,包括函式返回型別,函式名,引數型別以及一些標識號等,如下圖:
這樣如果我們在程式中直接呼叫該函式就會出現「有無法解析的符號」這樣的錯誤了。
但是如果我們使用的是含有修飾符的匯出函式的.dll檔案,就會出現如下的錯誤:
為Symbian編寫動態鏈結庫DLL
dll dynamic link library 是一段特殊的 它能夠被外部程式在程式 執行的時候呼叫。在dll裡面的 可以同時被許多外部程式共享,而且不會引起 手機記憶體的重複分配。靜態介面vs多型介面 symbian系統支援兩種型別的dll 1 靜態介面dll 2 多型介面dll 靜態介面dll...
動態鏈結庫DLL
函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 靜態庫 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在多個同樣的程式執行時,系統保留了許多重複的 副本,造成記憶體資源浪費。動態庫 使用...
編寫動態鏈結庫
很多時候我們寫 的時候會經常用到某些 段,比方說求兩個或幾個整數的和或者將乙個整形陣列轉化為二叉樹等等。經常使用這些 但是每一次又得重新再寫一遍,次數多了等於就是重複無用勞動了。所以,可以自己動手寫乙個自己的動態鏈結庫,儲存起來。下次用到只需要加上庫就ok了,這樣既方便了自己又對動態鏈結庫本身的工作...