C/C++動態鏈接庫的創建和使用,顯式調用

1,創建動態鏈接庫在VS2008中,首先創建一個項目,

選擇win32應用程序,點擊確定,下一步選擇應用程序類型:DLL,附加選項是:空選項

在這個項目中創建一個頭文件:CustomDll.h

  1. #ifdef CustomDLL_EXPORTS  
  2. #define CustomDLL_API_declspec(dllexport)  
  3. #else  
  4. #define CustomDLL_API_declspec(dllimport)  
  5. #endif  
  6.  
  7. //聲明自定義導出函數  
  8. int DLLFuncAdd(int a,int b); 

在項目中創建一個源文件CustomDll.cpp

  1. #include "CustomDll.h"  
  2. #include <Windows.h>  
  3. //DllMain函數 就是動態鏈接庫的入口點,windows在庫裝載,卸載,線程創建和結束的時候都要調用入口函數,  
  4. //以便動態鏈接庫可以採取相應的動作。  
  5.  
  6.  
  7. //hMODULE是該DLL模塊的句柄,代表這個文件的映像加載到進程的地址空間時使用的基地址。  
  8. //ul_reason_for_call參數的值表示本次調用的原因,取值:  
  9. //   DLL_PROCESS_ATTACH被加載的時候  
  10. //   DLL_PROCESS_DETACH被卸載的時候  
  11. //   DLL_THREAD_ATTACH應用程序創建了一個新的線程  
  12. //   DLL_THREAD_DETACH某個線程正常終止  
  13. BOOL APIENTRY DllMain( HMODULE hMODULE, DWORD ul_reason_for_call, LPVOID IpReserved)  
  14. {  
  15.     switch (ul_reason_for_call)  
  16.     {  
  17.         //動態鏈接庫被映射到某個進程的地址空間  
  18.     case  DLL_PROCESS_ATTACH:  
  19.         //應用程序創建新的縣城  
  20.     case DLL_THREAD_ATTACH:  
  21.         //應用程序某個線程正常終止  
  22.     case DLL_THREAD_DETACH:  
  23.         //動態鏈接庫將被卸載  
  24.     case DLL_PROCESS_DETACH:  
  25.         break;  
  26.     }  
  27.     return true;  
  28. }  
  29. //自定義導出函數,求兩個整數的和  
  30. int DLLFuncAdd(int a,int b){  
  31.     return a+b;  

在項目中新建文件.def 文件,把DLL定義爲導出函數CustomDll.def

  1. EXPORTS  
  2. DLLFuncAdd 

點擊生成-->>生成解決方案 會生成一個 C++Dll.dll的動態鏈接庫文件,下面介紹這個動態鏈接庫的顯示調用:首先把C++Dll.dll和要調用的程序放在同一個目錄:AppMain.cpp

  1. #include <iostream>  
  2. #include <Windows.h>  
  3. using namespace std;  
  4.  
  5. //聲明DLL裏的函數原型  
  6. typedef int (*PFNEXPORTFUNC)(int,int);  
  7.  
  8. int main(){  
  9.     int c = 12 ,d=20;  
  10.     int result;  
  11.  
  12.     //加載目標DLL,利用LoadLibary()函數加載指定目錄下的DLL庫到進程的虛擬地址空間,函數執行成功的話,返回此DLL模塊的句柄  
  13.     //否則返回NULL  
  14.     //LoadLibary的函數聲明  
  15.     //HMODULE WINAPI  
  16.     //LoadLibrary(  
  17.     //  LPCTSTR lpFileName  
  18.     //);  
  19.  
  20.     HMODULE hMODULE = LoadLibrary(TEXT("c++_dll.dll"));  
  21.     if(hMODULE!=NULL){  
  22.         PFNEXPORTFUNC mDLLfuncAdd = (PFNEXPORTFUNC)  
  23.                 GetProcAddress(hMODULE,"DLLFuncAdd");// GetProcAddress這個函數來獲得目標DLL中導出函數的地址  
  24.         //GetProcAddress函數的聲明  
  25.         //FARPROC GetProAddress(  
  26.         //  HMODULE hMOULE,  
  27.         //  LPCSTR lpProcName  
  28.         //  );  
  29.         if(mDLLfuncAdd!=NULL){  
  30.             result = mDLLfuncAdd(c,d);  
  31.             cout<<result<<endl;  
  32.         }  
  33.         //釋放鏈接庫佔用的資源  
  34.         FreeLibrary(hMODULE);  
  35.     }  
  36.  
  37.     int t;  
  38.     cin>>t;  
  39.     return 0;  
  40. }  

 

本文出自 “Kenan_ITBlog” 博客,請務必保留此出處http://soukenan.blog.51cto.com/5130995/1077698

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章