程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 動態鏈接庫的簡單應用

動態鏈接庫的簡單應用

編輯:C++入門知識

動態鏈接庫是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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved