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月前
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
87 13
|
5月前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
5月前
|
小程序 Windows
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
|
4月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
112 0
|
5月前
|
安全 网络安全 API
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
|
6月前
|
JavaScript Windows
electron程序运行在某些 windows 上白屏
electron程序运行在某些 windows 上白屏
|
6月前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
|
8月前
|
Windows
windows系统bat批处理 开机一键多个程序
windows系统bat批处理 开机一键多个程序
123 1
|
8月前
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用"添加库"功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
240 0
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
9月前
|
Linux 开发工具 计算机视觉
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt是跨平台的开发工具,推荐使用QtCreator进行Windows和Linux开发。在Windows下,使用Visual Studio创建动态库时,需要配置.lib文件并确保运行时.dll与.exe在同一目录。在QtCreator中添加DLL动态库,可以通过右键项目,选择添加库,然后在Details界面配置库文件、包含路径和平台,最后更新PRO文件并进行清除、qmake和构建步骤。运行时同样需确保.dll文件与可执行文件在同一目录。
320 5