Windows Dll的构建和导入

去年校招在美的面试时,emmm,被问倒了。 Dll基本的部分本事不太复杂,真需要静下心来,细细研究这方面的知识。

——以不变应万变!

update 2019/11/14: 从主要目的来看,这个构建和导入的过程,核心是通过编译产生二进制文件,并在软件启动时加载到内存中,其中内存里存放了dll相关函数的转跳地址。需要使用时,通过汇编的转跳指令转跳到相关函数上,本质上和普通的函数调用时没有任何区别的,windows仅仅对其进行了一层封装,便于软件层面的开发和管理。


  1. DLL构建

    1. *.h头文件编写,包含:函数原型、数据结构、符号

    2. *.cpp源文件--->实现头文件中定义的功能

    3. 由源文件生成一 一对应的*.obj文件

    4. 链接器合并obj文件产生独立DLL文件,文件包含:二进制代码、全局及静态变量

    5. 若DLL中有函数或变量,链接器生成一个*.lib文件,包含:函数和变量符号名

  2. 构建可执行模块

    1. 取出上文构建DLL时使用的*.h头文件和DLL文件

    2. 通过.h引用函数、变量

    3. 源文件产生obj文件

    4. 合并所有obj文件,产生exe文件,其中包含:

      • 二进制代码

      • 全局及静态变量

      • 导入段(所需DLL名称)

      • 引用函数+变量名

    5. 执行exe文件

      • 加载至虚拟地址空间

        • 可执行模块载入

        • 导入段定位

        • 主进程运行

 


答疑

Q: 为什么有时候.h和.dll都配置好了,但是在编译的时候会报“××××无法解析的外部符号”呢?

A: 链接器需通过*.lib文件来确定DLL的导出符号(函数、变量名),若没有在*.lib文件中找到就会报此错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值