Windows库程序

静态库

静态库特点
  • 运行不存在 --> 没有入口
  • 静态库源码被链接到调用程序中
  • 目标程序的归档
C语言静态库
  • C静态库的创建

    1. 创建一个静态库项目
    2. 添加库程序,源文件使用C文件
  • C静态库的使用

    库路径设置: 可以使用pragma关键字设置

    #pragma comment(lib,".../xxx.lib")
    
C++语言静态库
  • C++静态库的创建

    1. 创建一个静态库项目

    2. 添加库程序,源文件使用CPP文件

  • C++静态库的使用

    库路径设置: 可以使用pragma关键字设置

    #pragma comment(lib,".../xxx.lib")
    

    C++ 静态库函数使用时必须要有声明

    C++ --> 换名,编译器会给函数换名

    C编译器没有换名

  • C++ 不换名

    extern "C" 函数声明;
    // 使用C方式编译,不换名
    

动态库

动态库特点
  1. 运行时独立存在 --> 可以运行 --> 依附其他程序存在 --> 运行后有自己的地址空间
  2. 源码不会链接到执行程序
  3. 使用时加载( 使用动态库必须是动态库执行 )
与静态库比较
  1. 由于静态库是将代码嵌入到使用程序中,多个程序使用时,会有多份代码,代码体积会增大。动态库的代码只需要存在一份,其他程序通过函数地址使用,所以代码体积小

  2. 静态库发生变化后,新的代码需要重新链接嵌入到执行程序中。动态库发生变化后,如果库中函数的定义(或者地址)未变化,其他使用DLL的程序不需要重新链接

动态库创建
  • 创建动态库项目

  • 添加库程序

  • 库程序导出 - 提供给使用者库中的函数等信息

    导出的是函数地址

    1. 声明导出

      使用_declspec(dllexport) 导出函数

      动态库编译链接后,也会有LIB文件,是作为动态库函数映射使用,与静态库不完全相同

      要使用extern “C” --> 不换名

    2. 模块定义文件 .def

      LIBRARY  动态库文件名->不要.dll后缀
      EXPORTS        // 库导出表
      函数名1   @1    // 导出的函数
      函数名2   @2    // 导出的函数
      函数名n   @n    // 导出的函数
      

动态库的使用
  • 隐式链接( 操作系统负责使用动态库执行)

    1. 头文件和函数原型

      可以在函数声明前,增加_declspes(dllimport)

      _declspes(dllimport) 函数声明;
      
    2. 导入动态库的LIB文件

      #pragma comment(lib,"xxx.lib")
      
    3. 在程序中使用函数

    4. 隐式链接的情况,dll文件可以存放的路径

      1. 与执行文件同一个目录下
      2. 当前工作目录
      3. Windows目录
      4. Windows/System32目录
      5. Windows/System
      6. 环境变量PATH指定目录
  • 显式链接( 自己负责使动态库执行 )

    1. 定义函数指针类型 typedef

      typedef int (*ADD) (int m,int n);
      
    2. 加载动态库

      HMODULE LoadLibrary(LPCTSRT lpFileName   // 动态库文件名或者全路径
      );// 返回DLL的实例句柄 ( HINSTANCE )
      

      让动态库进内存

    3. 获取函数真实地址

      地址值为0 是NULL, 为无效地址

      FARPROC GetProcAddress(HMODULE hModule , // DLL句柄LPCTSRT lpProcName, // 函数名称
      ); // 成功返回函数地址
      
    4. 使用函数

    5. 卸载动态库

      BOOL FreeLibrary(HMODULE hModule  // DLL的实例句柄
      );
      
动态库中封装类
  • 在类名称前增加_declspec(dellexport)定义

    class _declspec(dllexport) CMath{//...  public:int Add(int n1,int n2);int Sub(int n1,int n2);
    };
    
  • 通常使用预编译开关切换类的导入导出定义

    #ifdef DLLCLASS_EXPORTS
    #define EXT_CLASS _declspec(dllexport)
    #else
    #define EXT_CLASS _declspec(dllimport) // 使用者
    #endif
    

导出的不是类,类是没有地址的,实际上导出的是类的成员函数地址

Windows库程序相关推荐

  1. 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台静态库程序类型 | 编译逆向工具依赖的 Windows 平台静态库程序 )

    文章目录 一.Windows 平台静态库程序类型 二.编译逆向工具依赖的 Windows 平台静态库程序 一.Windows 平台静态库程序类型 在 Android 逆向通用工具 MobileGame ...

  2. 【OpenGL】一、Visual Studio 2019 创建 Windows 桌面程序 ( Visual Studio Installer 安装 C++ 桌面开发库 | 创建桌面程序 )

    文章目录 一.Visual Studio Installer 安装 C++ 桌面开发库 二.Visual Studio 2019 创建 Windows 桌面程序 之前曾使用 Visual Studio ...

  3. javascript不依赖库开发windows应用程序

    其实javascript不仅可以做网页应用,也可以不依赖任何环境开发windows应用程序.windows系统自带mshta.exe,相当于一个javascript虚拟机,我们把.html文件扩展名改 ...

  4. 网页设计师的必备选择20 +必需的Windows应用程序

    今天给网页设计师推荐20几个windows下提高工作效率的应用程序,对于设计师来说是必不可少的,希望大家喜欢 1. Skybound Stylizer 虽然我更喜欢使用Firebug时,我发现&quo ...

  5. winpython使用教程-使用Python开发windows桌面程序【超简单】

    一.开发前期准备 1. boa-constructor-0.6.1.bin.setup.exe #一个wxWidges的集成开发环境,简单如Delphi,可以直接拖拽控件,并且和其他集成环境不一样, ...

  6. 比较windows phone程序启动和android程序启动原理

    windows phone 程序是如何启动的了,他和android程序有什么区别,我们重点从native code 层面来分析 在windows phone 程序启动的时候是: 在XAML中使用应用程 ...

  7. Py之cx_Freeze:Python库之cx_Freeze库(程序打包)简介、安装、使用方法详细攻略—案例之实现机器人在线24小时智能翻译

    Py之cx_Freeze:Python库之cx_Freeze库(程序打包)简介.安装.使用方法详细攻略-案例之实现机器人在线24小时智能翻译 导读      将Python程序生成exe程序目前流行这 ...

  8. windows应用程序框架及实例

    应用程序框架: 同一类型应用程序的结构大致相同,并有很多相同的源代码, 因此可以通过一个应用程序框架AFX(Application FrameWorks) 编写同一类型应用程序的通用源代码. 主要向导 ...

  9. linux如何运行windows游戏,如何在Linux上运行Windows应用程序和游戏 互联网技术圈 互联网技术圈...

    在本教程中,我将向您介绍如何在Linux中运行Windows应用程序和游戏.您可能知道,Microsoft Windows使用DirectX来运行游戏.因此,在Windows平台上玩一些需要Direc ...

最新文章

  1. 模板元编程时的参数推导类型输出
  2. Linux基础命令---e2fsck
  3. ajax实现关联词提示
  4. SAP ABAP如何隐藏你写的程序代码(危险,请小心谨慎)
  5. LUA 运行期间不独占线程的递归,通过回调实现
  6. c语言case的应用,switch、case的使用
  7. closewait一直不释放_夏至太阳庆典 || 巨蟹座日蚀新月大释放蜡烛魔法仪式(寻找新的幸运儿)...
  8. linux 第一个内核模块Hello World
  9. SHA-1算法的C语言实现(源码来自网络)
  10. Oracle 数据库、Microsoft SQL Server、MySQL 数据库三种常见数据库的区别深度剖析
  11. 块格式化上下文(Block Formatting Context,BFC)
  12. Unity3D播放背景音乐
  13. 第7章 PCA与梯度上升法 学习笔记下
  14. linux vi 底行命令,Linux下vi命令详解
  15. Lambda表达式与函数式接口详解
  16. python 怎么爬桌软件数据_python爬虫怎么从软件界面抓取数据?
  17. rk3399 android 9.0 root 权限及测试应用
  18. 人民币大写的正确写法(开票据事项)
  19. CPC、MAU、DAU....术语集(1)
  20. Swift之函数的语法和使用 | CSDN创作打卡

热门文章

  1. Ubuntu配置基于aarch64的Qt编译环境
  2. 蝉知MySQL设置_蝉知网站搜索白屏问题(迁移mysql数据库)
  3. 中高级测试工程师68道面试题
  4. git基本概念以及简单用法
  5. AE安装包+安装教程
  6. SpringBoot整合通用Mapper
  7. 【菜鸟教程】Zookeeper基础入门(使用curator)【下】
  8. python开源web项目-30 个惊艳的Python开源项目
  9. php 美颜,图像处理美颜算法之瘦脸及放大眼睛
  10. 利用Mycat分库分表操作