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. }  

 

你可能感兴趣的:(动态链接库,创建和调用)