动态调用与静态调用
最近学习了动态调用与静态调用的一些知识。哈哈。写一些心得体会。
首先讲一下库函数。所谓的库函数,就是很多函数的集合,实现各种功能的函数集中起来供程序调用。这样就有利于共享与避免重复书写。一次写,多次用。
我们编程的时候也接触过很多include进来的库函数。还有就是自己在头文件中敲的很多自定义函数。这些函数是要编译进.exe文件中去的,像这样的要将函数编译进. exe文件中的这些函数库调用就叫做静态库。平时我们可能没什么感觉,觉得这样还行。但是当我们的程序够大的时候,会有很多很多的函数,就像编写qq程序一样,需要很多的 函数,如果都将其编译到exe文件中,无疑这个exe文件的体积会非常大。
怎样解决这个问题呢,我们就需要用到动态库啦。
所谓的动态库就是讲函数的代码都写到dll文件中去。需要用到的时候我们在加载或引用。这样也有利于程序员之间的分工。
先写一些这么编写dll程序。我们新建一个Win32 Dynamic-Link Library文件。只需要在在每个函数前面加上:extern "C" _declspec(dllexport) 这一句代码。其余跟一般函数没什么区别。例如
extern "C" _declspec(dllexport) int add(int i1,int i2)
{
return i1+i2;
}
写好了编译成dll文件就ok了。
写好dll文件了。就需要怎样去调用它。这里也有两种调用方式,就是静态调用很动态调用。注意:动态调用与静态调用只是动态库的两种调用方式。
静态调用:只需要在程序的前面声明一下:
#pragma comment(lib, "dll1.lib")
extern "C" _declspec(dllexport) int add(int i1,int i2);
然后就可以像调用普通函数一样调用了。
如果dll中函数很多的话,一般都是由dll开发者开发好.h文件,把函数的声明都写好,然后供其他人调用,只要include就好了。程序运行时会去指定目录下找相应的dll文件。如果没有找到就不能启动程序。
动态调用:比较复杂。动态调用是在程序中需要用到dll文件内的函数时才去加载该文件。
这里直接举个例子说明:
typedef int(__cdecl* FunctionAdd)(int,int); //声明相应的函数指针类型。
函数指针
HMODULE hModule; //指向dll文件的句柄。
FunctionAdd add; //指向相应函数的指针实例。
hModule = LoadLibrary("dll1.dll"); // LoadLibrary 将dll1.dll文件加载进内存中来。用句柄指向。文件目录可以任意。
If(NULL==hModule )
{
//error.
}
add =(FunctionAdd)GetProcAddress(hModule,"add"); //根据dll的句柄得到相应函数的指针。
if(NULL==add)
{
//error
}
int r = add(1,1) ; //得到指针后就可以用相应的函数啦。
Wsprintf msgbox
FreeLibrary(hModule); //释放dll句柄。
这里大概可以分这几步:1.加载dll文件,2。取得文件内相应函数的指针。3.使用函数。4.释放dll句柄。
我们可以讲我们经常用到的函数风装成dll文件。供我们以后调用。
好好学习,天天向上啦。哈哈哈。come on baby。