Windows/MFC_dll生成文件___浅谈def文件(用于生成dll)

2024-05-03 08:08

本文主要是介绍Windows/MFC_dll生成文件___浅谈def文件(用于生成dll),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

def文件格式(DLL导出)  

2009-12-03 21:37:41|  分类: C++ |举报 |字号 订阅

今天接触了def文件,在客户端工程里有不少def文件,有关dll导出的今天就花时间看了看,以前包括现在自己在使用dll的时候很少用到dll一个强大功能,就是跨语言,用vb做界面调用vc写的dll各取所长。以前没碰到过def这个文件,就上网看了看,看完后明白了大概的作用。

 

为了实现C++语言的函数重载、运算符重载之类的高级特性,因为函数重载的时候不同的函数公用一个相同的函数名,所以编译器就使用了名称修饰对不同函数进行名字修饰用以区分各个函数。例如C的函数void function();这个函数被编译器编译后名字就成了_function@这个样子了,所以导出dll的时候函数名就是 _function@C++为了实现重载这些高级特性修饰规则会更复杂,这就不多说了。这里有个C++修饰过的函数名,看起来真得很可怕,太长了。

def文件格式(DLL导出) - 韩少文 - → 螃 蟹 ←   的 地 盘

还有一个比较关键的因素是函数的调用约定,它规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题,C++默认的抵用约定是__cdecl这种类型的,典型的printf这种可变参数就是依赖了这种调用方式,此外还有其他几种调用约定,这里就不细说了。

 

明白了上面2个问题,这时候引出新的问题,为了使其他语言(VBPascal什么的)可以使用VC编写的dll,因为VBC++的函数调用约定是不同的,那么就有问题,首先是函数名修饰规则不一样,VB调用函数function的时候就会提示找不到所引用的函数,因为dll中的函数名是_function@,这时候就引入def文件,他能指定导出dll的时候函数名,例如我在咱1.48客户端找到D3D的渲染dll,有个def文件叫OgreD3D9RenderSystem.def ,里面有这样的语句

 

def文件格式(DLL导出) - 韩少文 - → 螃 蟹 ←   的 地 盘

 

LIBRARY RenderSystem_Direct3D9

EXPORTS 

         dllStartPlugin @1

         dllStopPlugin @2

 

按照我的理解,应该存在一个名字为RenderSystem_Direct3D9.dll的文件,而里面有名字为dllStartPlugindllStopPlugin两个导出函数,果然在1.48的文件夹下搜索到了这个dll,用dumpbin工具查看里面的导出函数,看到了如下的结果

def文件格式(DLL导出) - 韩少文 - → 螃 蟹 ←   的 地 盘

ordinal hint RVA      name

      1    0 00002D80 dllStartPlugin

      2    1 00002E40 dllStopPlugin

 

这下明白了def文件的作用。

在网上看到了这样的描述,使用def文件来输出函数的一个主要目的就是:将编译器生成的函数修饰去掉,用更加自然、更加容易理解、更加容易记忆的名字来命名函数,而不是一串让人一看就吓一跳的修饰名字。

客户端就是C++编码,也没有什么别的语言来调用了?为什么还要这么弄呢?也是在网上看的,他这么说:“写动态库要着眼于‘大局’, 要一切符合‘标准’,什么是‘大局’?大局就是走可持续发展道路,就是复用。“

以上是今天自己的一点看法,还不是很清楚再什么时候用def文件。

这篇关于Windows/MFC_dll生成文件___浅谈def文件(用于生成dll)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956252

相关文章

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务