Windows库程序

简介: Windows库程序

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” --> 不换名

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

动态库的使用
  • 隐式链接( 操作系统负责使用动态库执行)
  1. 头文件和函数原型
    可以在函数声明前,增加_declspes(dllimport)
_declspes(dllimport) 函数声明;
  1. 导入动态库的LIB文件
#pragma comment(lib,"xxx.lib")
  1. 在程序中使用函数
  2. 隐式链接的情况,dll文件可以存放的路径
  1. 与执行文件同一个目录下
  2. 当前工作目录
  3. Windows目录
  4. Windows/System32目录
  5. Windows/System
  6. 环境变量PATH指定目录
  • 显式链接( 自己负责使动态库执行 )
  1. 定义函数指针类型 typedef
typedef int (*ADD) (int m,int n);
  1. 加载动态库
HMODULE LoadLibrary(
  LPCTSRT lpFileName   // 动态库文件名或者全路径
);// 返回DLL的实例句柄 ( HINSTANCE )

让动态库进内存

  1. 获取函数真实地址

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

FARPROC GetProcAddress(
  HMODULE hModule , // DLL句柄
    LPCTSRT lpProcName, // 函数名称
); // 成功返回函数地址
  1. 使用函数
  2. 卸载动态库
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

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

相关文章
|
1月前
|
消息中间件 编译器 API
Windows窗口程序
Windows窗口程序
|
19天前
|
Windows
windows系统bat批处理 开机一键多个程序
windows系统bat批处理 开机一键多个程序
|
1月前
|
Windows
LabVIEW启用/禁用Windows屏幕保护程序
LabVIEW启用/禁用Windows屏幕保护程序
26 4
LabVIEW启用/禁用Windows屏幕保护程序
|
15小时前
|
C++ UED 开发者
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
2 0
|
1月前
|
算法 Linux Windows
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
在Windows环境下为FFmpeg集成字幕渲染库libass涉及多个步骤,包括安装freetype、libxml2、gperf、fontconfig、fribidi、harfbuzz和libass。每个库的安装都需要下载源码、配置、编译和安装,并更新PKG_CONFIG_PATH环境变量。最后,重新配置并编译FFmpeg以启用libass及相关依赖。完成上述步骤后,通过`ffmpeg -version`确认libass已成功集成。
46 1
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
|
22天前
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用"添加库"功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
29天前
|
Linux 开发工具 计算机视觉
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt是跨平台的开发工具,推荐使用QtCreator进行Windows和Linux开发。在Windows下,使用Visual Studio创建动态库时,需要配置.lib文件并确保运行时.dll与.exe在同一目录。在QtCreator中添加DLL动态库,可以通过右键项目,选择添加库,然后在Details界面配置库文件、包含路径和平台,最后更新PRO文件并进行清除、qmake和构建步骤。运行时同样需确保.dll文件与可执行文件在同一目录。
|
11天前
|
Windows
|
1月前
|
存储 安全 搜索推荐
Windows之隐藏特殊文件夹(自定义快捷桌面程序)
Windows之隐藏特殊文件夹(自定义快捷桌面程序)
|
1月前
|
安全 Linux 网络安全
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
37 0