动态调用与静态调用

最近学习了动态调用与静态调用的一些知识。哈哈。写一些心得体会。

首先讲一下库函数。所谓的库函数,就是很多函数的集合,实现各种功能的函数集中起来供程序调用。这样就有利于共享与避免重复书写。一次写,多次用。

  我们编程的时候也接触过很多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。

posted @ 2011-04-16 23:43  GY小小鸟  阅读(2510)  评论(0编辑  收藏  举报