DLL开发总结

Table of Contents

  1. 前言
  2. 一个简单的例子
  3. PE格式与dumpbin工具
    1. PE格式
    2. dumpbin常用命令
  4. DLL符号的导出
    1. 命令行参数法
    2. Def文件法
    3. __declspec(dllexport)声明法
    4. #pragma linker命令法
  5. DLL的使用
    1. 显式加载
    2. 隐式链接
    3. 两者的区别
  6. DLL的搜索
  7. C++与DLL
    1. 名称修饰机制的影响
      1. 问题分类
      2. 类型B\C问题与extern “C”
      3. 类型D问题与符号导出
    2. PIMPL技法

前言

回想工作的这两年时间,绕不开的就是一个Dll,动态库开发也算是小有经验了,可惜一直沉下心来做一个简单的总结,今天也算是对自己一个小交代。

主要内容涉及以下几个方面:

  • DLL创建
  • DLL开发中的惯用法
  • dumpbin工具的使用

一些参考的资料如下:

一个简单的例子

假设我们想写一个dll库,其代码如下:

// math.cpp

extern "C" int __cdecl Add(int a, int b)
{
    return a + b;
}

extern "C" int __cdecl Sub(int a, int b)
{
    return a - b;
}

extern "C" int __cdecl Mul(int a, int b)
{
    return a * b;
}

extern "C" int __cdecl Div(int a, int b)
{
    return a / b;
}

然后可以使用下面的命令行编译:

E:\DllDemo>cl /c math.cpp
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.26.28806 版
版权所有(C) Microsoft Corporation。保留所有权利。

math.cpp

E:\DllDemo>link math.obj /DLL /NOENTRY /EXPORT:Add /EXPORT:Sub /EXPORT:Mul /EXPORT:Div
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

正在创建库 math.lib 和对象 math.exp

E:\DllDemo>dir
驱动器 E 中的卷是 数据
卷的序列号是 1A7E-A8B7

E:\DllDemo 的目录

2021/03/13  19:10    <DIR>          .
2021/03/13  19:10    <DIR>          ..
2021/03/13  19:09               272 math.cpp
2021/03/13  19:10             2,048 math.dll
2021/03/13  19:10               893 math.exp
2021/03/13  19:10             2,056 math.lib
2021/03/13  19:09               761 math.obj
5 个文件          6,030 字节
2 个目录 59,667,820,544 可用字节

PE格式与dumpbin工具

PE格式

众所周知,CS的世界离不开各种各样的协议,视频有MP4,音频有MP3,而程序呢?windows下的程序遵循的文件格式为PE格式,我们可粗略的看一下PE格式的内容:

PE Format 功能
DOS Stub DOS程序校验
PE Signature PE\\0\\0
COFF File Header 包含文件的一些参数,例如平台、类型等
Optional Header 虽然名称是Optional,实际上对于Image类型是必须包含的
Section Headers 包含section的信息
Sections 包含代码、数据、资源等内容

在其中的Section部分,就包含了DLL的导出信息,在这里我们不讨论的过深,因而略过各种复杂的讨论,直接使用dumpbin工具查看dll的导出信息:

E:\DllDemo>dumpbin /EXPORTS math.dll
Microsoft (R) COFF/PE Dumper Version 14.26.28806.0
Copyright (C) Microsoft Corpor
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值