尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

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平台下的存在本质上是软件工程中“模块化”与“复用”思想的体现。不同类型的库在链接时机、依赖关系、共享方式和适用场景上各有侧重开发者需要根据项目的具体需求如独立性要求、体积限制、多语言支持、部署复杂度等选择合适的库类型。
返回列表