動態鏈接庫是windows下實現數據共享的一種重要方法,它提供了 二進制層上的共享。
動態鏈接庫 可以很好的實現 項目模塊之間的分離,如果某一模塊出錯不需要重新編譯整個項目,只需要修改相應的模塊 ,以及在產品的升級過程中 我們可以通過替換dll文件來實現產品的升級.
動態鏈接庫包含2個文件 lib因入口 和dll動態鏈接庫 ,我們在程序中通過已入庫 來調用dll文件中 存儲的函數 。
DLLMain函數 是DLL文件的入口函數 在dll進行初始化或者釋放的時候都會調用這個函數,相對應的就是LoadLibrary和FreeLibrary 函數
在動態鏈接庫中只有 指定為 _declspec(export)的函數 以及變量可以被 外部程序所調用.
在外部程序調用的時候需要 聲明為 _declspec(dllimport ) .......或者extern.........聲明 。。
在C/C++中我們是可以 這樣使用,因為VC這個IDE知道這個命名規范,
在VC中 動態鏈接庫 默認 導出的 名字是 _FunctionName@參數表字節總數 ,那麼我們就需要以這樣的格式導入 函數 ,如果嫌函數聲明麻煩,那麼就聲明模塊定義文件
來固定函數名稱 。,
__stdcall是函數調用約定的一種,函數調用約定主要約束了兩件事:
1.參數傳遞順序
2.調用堆棧由誰(調用函數或被調用函數)清理
常見的函數調用約定:stdcall cdecl fastcall thiscall naked call
__stdcall表示
1.參數從右向左壓入堆棧
2.函數被調用者修改堆棧
3.函數名(在編譯器這個層次)自動加前導的下劃線,後面緊跟一個@符號,其後緊跟著參數的尺寸
在win32應用程序裡,宏APIENTRY,WINAPI,都表示_stdcall,非常常見。
下面是在VC6中簡單的調用 dll中 類的 函數的代碼
#define DLLExport _declspec(dllexport) //聲明調用約定
#include <iostream>
using namespace std ;
DLLExport void Show()
{
cout<<"This is a simple dll test !" <<endl ;
}
class DLLExport MyClass //放在關鍵字後面
{
public:
MyClass(int x ,int y)
{
this->x=x ;
this->y=y ;
}
void Show()
{
cout<<"x="<<x<<endl ;
cout<<"y="<<y<<endl ;
}
private:
int x ;
int y ;
};
下面是 在另一個工程中調用dll
#pragma comment(lib,"TestLibrary")
#define DLLImport _declspec(dllimport)
DLLImport void Show() ;
class DLLImport MyClass
{
public:
int x ;
int y ;
public:
MyClass(int x,int y) ;
void Show() ;
};
void main()
{
Show() ;
MyClass cls(2,3);
cls.Show() ;
}
摘自 yue7603835的專欄