windows DLL技术-创建DLL的基本结构

发布时间:2026/9/29 16:12:17

windows DLL技术-创建DLL的基本结构 DLL可以使用任何编译器编译但是这里主要使用Microsoft Visual Studio来讲解下面是选择C、windows、库的模板:一共有下面几种主要的类别我们主要讨论的以下几种:动态链接库;静态库MFC动态链接库MFC ActiveX控件DLL(通用Windows);Windows运行时组件静态库为什么Windows平台需要库文件在Windows平台下库文件无论是动态链接库DLL还是静态库是软件开发中不可或缺的基础设施。其核心原因可以从以下几个层面理解一、代码复用的基本需求软件开发中大量功能是重复的——文件读写、网络通信、图形绘制、数学计算等。如果每个程序都从头实现这些功能不仅开发效率极低而且会重复造轮子。库文件正是为了解决这一问题而存在将通用的功能模块打包成库供多个程序共享使用。二、隐藏实现细节库文件以编译后的二进制形式发布提供方只需要交付库文件和头文件接口声明使用者即可调用其中的功能而无需看到功能实现的源码和细节。这在商业软件分发和保护知识产权方面具有重要意义。三、模块化与可维护性大型软件项目通常由多个团队协作开发将不同功能划分为独立的库模块可以使开发过程独立、耦合度小便于不同开发者和组织之间进行开发和测试。当某个模块需要更新时只要接口不变只需替换对应的库文件即可无需重新编译整个应用程序。四、内存与磁盘空间的优化动态链接库允许多个进程共享内存中的同一份代码副本避免了每个程序都各自加载一份相同代码的内存浪费。同时多个应用程序在磁盘上也可以共享同一个DLL文件节省磁盘空间。各类库文件的详细解释1. 静态链接库Static Library定义静态库是在编译链接阶段将库中的目标代码直接复制并合并到最终的可执行文件.exe中的库文件。在Windows平台上静态库文件通常以.lib为后缀。工作原理静态链接时链接器从静态库中获取所有被引用的函数将这些函数的代码连同应用程序自身的代码一起放到可执行文件中。程序运行时不再需要静态库文件存在。优点- 程序运行时不再依赖外部库文件可独立运行- 代码装载速度快执行速度略比动态链接库快- 发布程序时无需考虑用户机器上库文件是否存在及版本问题可避免“DLL地狱”缺点- 生成的可执行文件体积较大- 如果多个程序使用同一个静态库每个程序都会包含一份库代码的副本造成磁盘和内存的浪费- 库文件更新后所有依赖它的程序都必须重新编译链接典型应用场景独立性强的小型工具、对运行时依赖有严格要求的嵌入式或关键任务系统。2. 动态链接库DLL / Dynamic-Link Library定义动态链接库是Windows中作为函数和资源的共享库的一种可执行文件。它本身不能独立运行而是在应用程序运行时被加载到进程的内存空间中执行。在Windows平台上DLL文件以.dll为后缀。工作原理动态链接是操作系统提供的一种能力。编译时可执行文件只包含在运行时定位DLL函数所需的信息而非函数代码本身。程序运行时由Windows加载器将DLL映射到进程的内存空间。DLL的加载可以是在程序启动时隐式加载也可以在运行时按需显式加载通过LoadLibrary和GetProcAddress。优点- 节省内存多个进程可以同时使用内存中同一个DLL的只读部分副本- 节省磁盘空间多个应用程序可以共享磁盘上的同一个DLL文件- 易于升级和维护更新DLL中的函数实现后只要函数参数和返回值不变使用它的应用程序无需重新编译或重新链接- 支持多语言不同编程语言编写的程序只要遵循相同的函数调用约定都可以调用同一个DLL中的函数- 便于国际化可以将不同语言版本的字符串资源放在不同的资源DLL中程序按需加载缺点- 应用程序依赖外部DLL模块不是自完备的- 如果启动时需要的DLL不存在系统将终止程序并报错- 运行时动态链接比静态链接略慢- 存在“DLL地狱”风险——不同版本的DLL可能相互不兼容典型应用场景大型应用程序的模块化拆分、多程序共享的公共功能库如Windows系统DLLKernel32.dll、User32.dll等、插件系统。3. MFC动态链接库MFC DLL / 规则MFC DLL定义MFC动态链接库是指使用Microsoft基础类库MFC构建的DLL其导出函数可以被MFC或非MFC应用程序调用。根据与MFC库的链接方式又可分为两种- 动态链接MFC的规则MFC DLLDLL本身在运行时动态链接到MFC的共享DLL版本- 静态链接MFC的规则MFC DLLDLL将MFC库的代码静态链接到自身工作原理这类DLL内部使用MFC框架编写功能通过标准C接口导出函数供外部调用。如果选择动态链接MFC则DLL文件体积小但需要随程序一起分发MFC的共享DLL如Mfcx0.dll和Msvcrxx.dll如果选择静态链接MFC则DLL自包含所需的MFC代码无需额外分发MFC DLL但文件体积较大。特点- 动态链接MFC的DLL生成速度更快因为不需要链接MFC本身- 动态链接MFC的DLL文件尺寸更小且多个使用MFC的程序可以共享内存中的MFC DLL- 静态链接MFC的DLL在用户端即使没有MFC DLL也能正常工作典型应用场景使用MFC框架开发的需要被其他应用程序调用的功能模块。4. MFC ActiveX控件定义MFC ActiveX控件是基于组件对象模型COM的可重用软件组件。它支持多种OLE功能可以在自己的窗口中绘制自身、响应事件如鼠标单击并通过包含属性和方法的接口进行管理。ActiveX控件以.ocx为文件后缀。工作原理ActiveX控件是一种特定的自动化服务器类型可以理解为“极小的服务器应用程序”。但它不能独立运行必须嵌入到某个容器程序如网页浏览器、应用程序对话框等中运行。控件通过COM接口与容器通信容器可以调用控件的属性和方法控件则通过事件向容器发送通知。使用regsvr32命令可以向系统注册控件。重要说明微软官方已明确指出ActiveX是旧技术不应用于新开发。典型应用场景在网页中嵌入多媒体播放器、在应用程序中嵌入第三方功能组件如绘图控件、数据表格控件等。5. DLL通用Windows / Win32 DLL定义这里的“通用Windows DLL”指的是不使用MFC框架的标准Win32 DLL。它是Windows平台上最基础的DLL形式直接使用Windows APIWin32 API进行开发。工作原理与前述通用DLL的原理完全相同——在运行时被加载到调用进程的内存空间提供函数和资源的共享。Windows操作系统本身的核心功能就是通过一系列系统DLL提供的例如- Kernel32.dll管理内存、进程和线程- User32.dll执行用户界面任务窗口创建、消息传送等- Comdlg32.dll提供通用对话框打开文件、打印、选择字体等特点- 不依赖MFC框架体积小巧- 可被任何Windows应用程序无论使用何种语言或框架编写调用- 是Windows操作系统的基础组成部分典型应用场景系统级功能库、跨语言通用的基础组件、不需要GUI框架的纯功能模块。6. Windows运行时组件Windows Runtime Component / WinRT组件定义Windows运行时组件是自包含的软件模块可以采用任何Windows运行时语言包括C#、C/WinRT、Visual Basic、JavaScript和C/CX创作、引用和使用。工作原理Windows RuntimeWinRT是微软从Windows 8起引入的基于COM构建的现代化API架构。WinRT组件本质上是一个特殊的DLL但它通过语言投影language projection机制使得不同编程语言可以自然地调用其中的功能。组件使用Windows Metadata.winmd文件以语言无关的方式定义其API。对于C开发者微软推荐使用C/WinRT——一个基于标准C17的、完全头文件实现的库来使用和创建WinRT组件。与普通DLL的区别- 普通DLL的导出函数需要遵循特定的调用约定不同语言的调用有一定门槛- WinRT组件通过元数据定义接口可以被多种语言自然地调用无需关心底层二进制接口细节- WinRT组件是UWP通用Windows平台和现代Windows应用开发的核心组成部分典型应用场景UWP应用的组件化开发、需要被多种语言C、C#、JavaScript调用的通用功能模块、现代Windows应用商店应用。7. 静态库再次说明用户列表中重复列出了“静态库”此处补充说明在MFC开发语境下“静态库”可能特指MFC静态库版本——即MFC框架本身以静态库形式提供的情况。每个MFC版本都同时提供静态库版本和共享DLL版本。此外还有一个较小的MFC静态库版本省略了对话框中的MFC控件适用于对程序体积非常敏感且不需要这些控件的应用场景。库文件在Windows平台下的存在本质上是软件工程中“模块化”与“复用”思想的体现。不同类型的库在链接时机、依赖关系、共享方式和适用场景上各有侧重开发者需要根据项目的具体需求如独立性要求、体积限制、多语言支持、部署复杂度等选择合适的库类型。
延伸阅读

更多相关文章

2026/9/27 23:37:08

Kubernetes 运维预算有限:优先补足监控还是容量

Kubernetes 运维预算有限:优先补足监控还是容量 在 Q3 季度的云原生运维预算复盘会议上,财务团队抛出了一张令人难以置信的 API 账单:为了给 Kubernetes 生产集群接入 AI 增强型告警排障 Agent(RAG 知识库模式)&#…

2026/9/29 21:15:26

2026 国产边缘计算盒子选型指南|主流厂商梳理与行业场景适配

随着本地大模型推理、物联网数字化需求持续爆发,叠加国产替代、信创政策推进,边缘计算盒子已经成为工业、园区、零售、轨道交通项目的重要硬件。本文梳理2026年主流国产厂商,区分各家定位、优势与适用场景,方便项目选型。一、硬件…

2026/9/29 1:51:38

Ryujinx终极指南:如何快速上手Switch游戏模拟器

Ryujinx终极指南:如何快速上手Switch游戏模拟器 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上畅玩Switch独占游戏吗?Ryujinx作为一款用C#开发的开源…

2026/9/30 3:56:37

小程序商城的商品图,为什么直接影响复购率

小程序商城的商品图,为什么直接影响复购率做 B2B 订货的业务员普遍觉得图片不重要:客户都是老客户,知道货长什么样。但实际使用数据里,商品图的缺失带来的影响比想象得大很多,而且不体现在第一次下单上,体现…

2026/9/30 3:56:37

鸿蒙下React Native重渲染优化:useCallback与memo实战

React Native鸿蒙跨平台,放在两年前还是不太敢碰的方向,今年已经成了不少团队绕不开的课题。我做鸿蒙端React Native适配和性能优化小半年,最让我头疼的倒不是API差异,而是那些看似不起眼的"多余渲染"——页面卡顿、列表…

2026/9/30 3:56:37

华为OD机试高频题:用map+list实现支持优先级队列的容器实战

最近在带一波准备华为OD机试的朋友,发现C卷100分的题目里,“支持优先级队列 - map与list”出场率相当高。很多第一次刷到这道题的人,第一反应都是“不就是堆吗”,结果一上手就发现不对劲:题目里压根没让你直接用优先队…

2026/9/30 3:56:37

Qt QFont全解析:从字体匹配到DPI适配的实战指南

字体这事儿,说大不大,说小不小。做Qt界面开发的,十有八九都在QFont上吃过亏——要么中文显示成方块,要么高分屏下控件挤成一团,要么DPI一变化整个界面直接没法看。问题看起来五花八门,其实根子往往都落在同…

2026/9/30 3:56:37

从网格搜索到贝叶斯优化:超参数调优原理与实战

1. 为什么网格搜索和随机搜索迟早会撞墙1.1 一次让我怀疑人生的调参经历先说个真实的场景。几年前我在做一个工业设备故障预测的项目,数据量不算大,几万条样本、四十多个特征,模型选了 XGBoost。当时我的调参方式是教科书式的网格搜索&#x…

2026/9/30 3:51:37

Model-Optimizer:大模型推理全链路分层优化实践指南

1. 项目概述:Model-Optimizer不是工具名,而是一类工程实践的统称 “Model-Optimizer”这个词在当前技术社区里常被误认为是一个具体软件或开源项目——比如有人搜“Model-Optimizer下载”“Model-Optimizer GitHub”,结果却找不到官方仓库。…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑