zoukankan      html  css  js  c++  java
  • 动态调用与静态调用

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

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

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

    作者:GY小小鸟
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    World Wind Java开发之一(转)
    Excel如何显示隐藏列?
    Oracle开发›如何取出每个分组的第一条记
    如何解决EXCEL中的科学计数法
    使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10
    POI读取单元格信息及单元格公式
    java中判断字符串是否为数字的方法的几种方法
    阿里云OSS的 存储包、下行流量包、回流流量包 三者有啥关系
    vue+datatable+vue-resource动态获取jsonp数据2
    vue+datatable+vue-resource动态获取jsonp数据
  • 原文地址:https://www.cnblogs.com/YangFengHui/p/2018578.html
Copyright © 2011-2022 走看看