zoukankan      html  css  js  c++  java
  • 动态和静态链接库

    静态链接库文件 .lib

    动态链接库文件 .dll

    链接库:链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    链接库的编写:与源文件没有什么差别,只是少了一个main()入口函数,因此需要.exe文件调用(即不能自己运行)。(注:链接库的机器语言代码存储在.dll文件中,因此运行.exe文件时必须.dll文件可寻)

     优点(原因):抄的哈哈

    1、扩展了应用程序的特性;

    2、可以用许多种编程语言来编写;

    3、简化了软件项目的管理;

    4、有助于节省内存

    5、有助于资源共享

    6、有助于应用程序的本地化;

    7、有助于解决平台差异;

    8、可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。

    顺便说明一下黑客用处:dll文件一旦运行是不单独显示进程,因此在dll文件中加载木马是几乎不可发现,嘿嘿嘿嘿(你懂的)。

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    具体编写:

                                                             静态链接库

             创建.cpp文件和.h文件(由头文件的特性可知,头文件在任何程序中都可要可不要,只是标准而已(利于管理的目的))

             .h文件

             #ifndef LIB_H

            #define LIB_H

           extern "C"  int add(int,int);

           #endif

           .cpp文件

           #include "XXX.h"

           int add(int x,int y)

         {

                return x+y;

         }

        调用静态链接库

         创建.cpp文件

         #include " ........\lib.h"

        #pragma comment(.....\debug\lib.lib)

       int main()

    {

          ptintf("1+2=%d ",add(2,1));

         return 0;

    }

                                                              动态链接库

         创建dll文件

               创建.h文件

             #ifndef LIB_H

            #define LIB_H

           extern "C" int declspec(dllexport) int add(int,int);

           #endif

           创建.cpp文件      

           #include "XXX.h"

           int add(int x,int y)

         {

                return x+y;

         }

         函数导出方式1: int declspec(dllexport) int add(int,int);

        函数导出方式2:模块定义(.def)(须在dll工程中加.def文件)

        ;lib.def  导出dll函数     前面分号为注释相当于//

       LIBRARY  dll   ;dll文件名

       EXPORT          //导出函数

        add  @ 1        //函数名 +@+序号

        调用动态链接库

         方式一:动态调用方式(编程者用windows API加载和卸载dll文件)

         创建.cpp文件

         #include " ........\lib.h"

        #include <windows.h>

       typedef int(*lpf)(int,int);

       int main()

    {

          HINSTANCE hinstance;

          hinstance=LoadLibrary(",,,,,,\debug\ldll.dll");

         if(hinstance!=NULL)

        {

             lpf fun;

            fun=(lpf)GetAddress(hinstance,"add");

           if(fun!=NULL)

           {

                        printf("1+2=%d ",fun(1+2));

            }else{

                      printf("函数不存在");

                      }

                  FreeLibrary(hinstance);

        }else{   printf("动态链接库加载失败");   }

         return 0;

    }

    方式二(静态调用方式):(编译系统完成对dl的加载和应用程序结束时dll的卸载)

    extern "C" __declspec(dllimport) add(int x,int y);
    int main(int argc, char* argv[])
    {

    int result = add(2,3);
    printf ("%d",result);
    return 0;
    }

    由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作:


    (1)告诉编译器与DLL 相对应的.lib 文件所在的路径及文件名,#pragma comment(lib,"dllTest.lib")


    就是起这个作用。


    程序员在建立一个DLL 文件时,连接器会自动为其生成一个对应的.lib 文件,该文件包含了DLL 导出


    函数的符号名及序号(并不含有实际的代码)。在应用程序里, .lib 文件将作为DLL 的替代文件参与编译。


    (2)声明导入函数, extern "C" __declspec(dllimport) add(int x,int y)语句中的


    __declspec(dllimport) 发挥这个作用。

    静态调用方式不再需要使用系统API 来加载、卸载DLL 以及获取DLL 中导出函数的地址。这是因为,


    当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib 文件中导出符号相匹配的函数符


    号将进入到生成的EXE 文件中,.lib 文件中所包含的与之对应的DLL 文件的文件名也被编译器存储在EXE


    文件内部。当应用程序运行过程中需要加载DLL 文件时,Window s 将根据这些信息发现并加载DLL ,然后


    通过符号名实现对DLL 函数的动态链接。这样,EXE 将能直接通过函数名调用DLL 的输出函数,就象调用


    程序内部的其他函数一样。

  • 相关阅读:
    java 集合list遍历时删除元素
    循环中的continue功能
    sql中的!=判断的注意事项
    oracle中时间处理
    judge return character
    ashamed
    char and number transform
    将十进制转化为二进制
    算法和程序
    输入分子和分母,打印出前1000位小数
  • 原文地址:https://www.cnblogs.com/1234----/p/7681161.html
Copyright © 2011-2022 走看看