这是一篇关于动态链接库的创建和调用的比较好文章,收藏起来。

动态连接库的创建步骤:<?XML:NAMESPACE PREFIX = O />



一、创建Non-MFC DLL动态链接库



     1 、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project



         —> 工程名:DllDemo



     2 、新建一个.h文件DllDemo.h



#ifdef  
     DllDemo 
     _EXPORTS 
     
 
    
#define  
     DllAPI 
      __declspec(dllexport) 
     
 
    
#else 
     
 
    
#define  
     DllAPI 
      __declspec(dllimport) 
     
 
    
      
     extern "C" 
          
     // 
     原样编译 
      
     
 
    
{ 
     
 
    
DllAPI int  
     __stdcall 
      Max(int a,int b);  
     //__stdcall 
     使非C/C++语言内能够调用API 
      
     
 
    
} 
     
 
    
#endif



 



     3 、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数



#include "DllDemo.h" 
      
     
 
    
DllAPI int __stdcall 
     
 
    
     {                                          
     
 
    
         if(a==b) 
     
 
    
              return NULL; 
     
 
    
         else if(a>b) 
     
 
    
              return a; 
     
 
    
         else 
     
 
    
              return b; 
     
 
    
     }



     4 、编译程序生成动态连接库



二、用.def文件创建动态连接库DllDemo.dll。



     1 、删除DllDemo工程中的DllDemo.h文件。



     2 、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。



     3 、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:



LIBRARY MyDll
EXPORTS
Max@1



     4 、编译程序生成动态连接库。



 



动态链接的调用步骤:



一、隐式调用



1 、 建立DllCnslTest工程



2 、 将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录



3 、 在DllCnslTest.h中添加如下语句:



#define DllAPI __declspec(dllimport) 
     
 
    
#pragma comment(lib 
     ,"DllDemo.lib")   //在编辑器link时,链接到DllDemo.lib文件 
     
 
    
extern "C" 
     
 
    
{ 
     
 
    
DllAPI int __stdcall Max(int a,int b); 
     
 
    
}



4 、在DllCnslTest.cpp文件中添加如下语句:



#include " 
     DllCnslTest 
     .h"// 
     或者 #include "DllDemo.h" 
     
 
    
 
     
 
 
    
void main() 
     
 
    
{ 
     
 
    
    int value; 
     
 
    
     value = Max(2,9); 
     
 
    
     printf("The Max value is %d\n",value); 
     
 
    
}



5 、编译并生成应用程序DllCnslTest.exe



二、显式调用



1、   建立DllWinTest工程



2、   将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。



3、   用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。



4、   使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。



例:


typedef int(*lpMax)(int a,int b); // 
     此语句可以放在.h文件中


5、   通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。



例:


HINSTANCE hDll;    // 
     声明一个Dll实例文件句柄 
     
 
    
hDll = LoadLibrary("DllDemo.dll");// 
     导入DllDemo.dll动态连接库



6、   通过GetProcAddress()函数获取导入到应用程序中的函数指针。



例:


lpMax Max; 
     
 
    
Max = (lpMax)GetProcAddress(hDLL,"Max"); 
     
 
    
int value; 
     
 
    
value = Max(2,9); 
     
 
    
printf("The Max value is %d",value);



7、   函数调用完毕后,使用FreeLibrary()卸载DLL文件。



FreeLibrary(hDll);



8、   编译并生成应用程序DllWinTest.exe



注:显式链接应用程序编译时不需要使用相应的Lib文件。



转载于:https://blog.51cto.com/qq164587043/65270