windows下动态链接库(讲解)

动态链接在Linux下是.o文件,在windows就是dll文件。一些常用的dll库一般放在C:\WINDOWS\system32下,如果想注册一个dll可以拷贝一份,然后regsvr32命令注册一份。注册时候要注意dll所在目录是不可以有中文的,如果dll错误,那么有两种情况,版本不对和dll文件缺失。

微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL和的Extension Dlls一样,是用MFC类库编写的。
我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要注意的是在使用第一种方法的时候,不能使用DEF文件。

应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。

1.隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。
//Dlltest.h  
#pragma comment(lib,"MyDll.lib")  
extern "C"_declspec(dllimport) int Max(int a,int b);  
extern "C"_declspec(dllimport) int Min(int a,int b);  
//TestDll.cpp  
#include  
#include"Dlltest.h"  
void main()  
{int a;  
a=min(8,10)  
printf("比较的结果为%d ",a);  
}  

2.显式链接
  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。

void main(void)  
{  
typedef int(*pMax)(int a,int b);  
typedef int(*pMin)(int a,int b);  
HINSTANCE hDLL;  
PMax Max  
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;  
Max=(pMax)GetProcAddress(hDLL,"Max");  
A=Max(5,8);  
Printf("比较的结果为%d ",a);  
FreeLibrary(hDLL);//卸载MyDll.dll文件;  
}  


lib引用:
在VC的tools->options->directories里面的Library files添加目录
在project->settings->link的library modules加上ace.lib
在头文件中加上#pragma comment(lib, "ace.lib")

你可能感兴趣的:(windows下动态链接库(讲解))