zoukankan      html  css  js  c++  java
  • Windows动态链接库DLL

    1.什么是DLL
    DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。

    2.DLL的优缺点
    优点:代码重用,可供多个程序同时调用

    缺点:易发生版本冲突
    当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。
    针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。
    此时,程序将根据manifest加载指定版本的DLL,否则按默认版本加载。

    3.关于LIB和DLL
    LIB,是静态链接库,分为静态lib和动态lib。
    静态lib:包含函数代码声明和实现,编译后所有代码都嵌入到宿主程序中。不需要再另行调用DLL。
    动态lib:相当于一个.h头文件,它是对实现部分(.DLL)的导出部分的声明。编译后宿主程序也只包括声明部分。运行时需调用相应的DLL文件

    4.DLL编写
    1)在vs中,选择“文件”-》“新建”-》“项目”,选择“Visual C++”-》“win32项目”,来创建DLL类库。
    如下图所示:

    2)添加头文件(.h)和源文件(.cpp)
    mydll.h 

    extern "C" _declspec(dllexport) int add(int a, int b); 

    extern关键字:函数可以在本模块或其他模块中使用;
    "C":表明函数必须按C语言方式进行编译,因为C++支持函数的重载,编译时会对函数名进行更改(按照函数名+参数类型),
           所以需要声明"C",以便链接时能正确找到相应的函数。
    _declspec(dllexport)关键字:该函数可以从DLL中导出,程序引入DLL时,只有声明了该关键字的函数,才能导入使用

    mydll.cpp 

    #include "mydll.h" 
    int add(int a, int b) //该DLL需要导出的函数功能:加法 
    { 
         return a + b; 
    }

    编译后,我们可以在生成目录中找到相应的DLL文件和LIB文件。

    mydll.dll,mydll.lib

    5.DLL调用
    调用DLL有两种方式。
    1)显式链接(只使用DLL)

    特点:不需要使用相应的lib文件,可随时加载和卸载DLL,方便灵活。

    void main(void)
    {
        typedef int(*padd)(int a,int b);
        HINSTANCE hDLL;
        padd add;
        HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
        add=(padd)GetProcAddress(hDLL,"add");
        int result=add(5,8);
        Printf("计算的结果为%d
    ",result);
        FreeLibrary(hDLL);//卸载MyDll.dll文件;
    } 

    上例通过LoadLibray()将DLL加载到当前的应用程序,并返回当前DLL文件的句柄。
    然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,
    函数调用完毕后,使用FreeLibrary()卸载DLL文件。

    2)隐式链接(使用LIB,DLL)

    特点:程序开始执行时将DLL文件加载到应用程序中,程序结束后,释放DLL。

    #pragma comment(lib,"MyDll.lib")
    extern "C"_declspec(dllimport) int add(int a,int b);
    void main()
    {
        int a;
        a=add(8,10)
        printf("计算的结果为%d
    ",a);
    }

    #pragma comment是预处理指令,使得链接器在链接库的时候去找"MyDll.lib"这个库。

  • 相关阅读:
    聊天机器人遇到的难题
    Node.js应用程序一起使用Webpack的4个简单步骤
    AngularJS页面渲染完成之后执行DOM操作
    js实现取出数组中的最大数和最小数
    npm安装angular-ui-bootstrap和bower安装
    centos7离线安装nginx
    配置SSH免密登录,总是需要输入密码
    idea win 常用快捷键
    二、centos7在线搭建ceph之Filesystem
    k8s使用cephfs来挂载mysql数据
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/5606930.html
Copyright © 2011-2022 走看看