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

相关文章

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram