`
coolsooner
  • 浏览: 1311479 次
文章分类
社区版块
存档分类
最新评论

DLL编程总结

 
阅读更多

1)创建DLL

创建DLL的时候,头文件里在输出变量,函数,类之前使用__declspec(dllexport)修饰符号。当VC编译器看到变量,函数或者类之前的这个修改符的时候,它就将某些附加信息嵌入产生的.obj文件中。当链接DLL的所有.obj文件时,链接程序要查找关于输出变量,函数或类的信息,并自动生成一个.lib文件,它包含一个DLL输出的符号列表。如果要链接引用该DLL的输出符号的任何可执行模块,该.lib文件是必不可少的。(DLL工程需要定义MYMATHLIB_EXPORTS宏)

MyMathLib.h


MyMathLib.cpp


除了创建.lib文件外,链接程序还要将一个输出符号表嵌入产生的DLL文件。可以使用dumpbin程序察看dll的输出节。


2)创建可执行模块

可执行模块引用DLL的头文件,使用__declspec(dllimport)符号进行定义。当编器看到修改变量,函数或类的__declspec(dllimport)时,它知道这个符号是从某个DLL模
块输入的。创建产生的可执行模块的链接程序必须确定哪些DLL包含代码引用的所有输入符号。因此你必须将DLL的.lib文件传递给链接程序。

实际上,当输入一个符号时,不必使用关键字__declspec(dllimport),只要使用标准的C关键字extern即可。但是如果编译器预先知道你引用的符号将从一个DLL的.lib文件输入,那么编译器就能够生成运行效率稍高的代码。因此建议你尽量将__declspec(dllimport)关键字用于输入函数和符号。

MyEXE.cpp


当链接程序进行输入符号的转换时,它就将一个称为输入节的特殊的节嵌入产生的可执行模块。输入节列出了该模块需要的DLL模块以及由每个DLL模块引用的符号。
可以使用dumpbin程序察看模块的输入节。


3)调用约定

__stdcall
Pascal方式清理C方式压栈,通常用于Win32 Api中,.参数从右向左压入堆栈,.函数被调用者自己在退出时清空堆栈。

__cdecl
C调用约定The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)。它是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用__stdcall函数的大。

C编译时函数名修饰约定规则:
__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number。
__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。

C++编译时函数名修饰约定规则:
__stdcall调用约定:
  1、以“?”标识函数名的开始,后跟函数名;
  2、函数名后面以“@@YG”标识参数表的开始,后跟参数表;
  3、参数表以代号表示:
  X--void ,D--char,E--unsigned char,F--short,H--int,I--unsigned int,J--long,K--unsigned long,M--float,N--double,_N--bool,....
  PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复;
  4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
  5、参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。
  其格式为“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,
__cdecl调用约定:规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。

例如int Add(int lhs, int rhs) =〉 ?Add@@YAHHH@Z

可以使用extern "C" 防止VC编译器修改函数名字。

重新生成MyMathLib.dll后,使用dumpbin察看输出节:

如果加上__stdcall修饰符,

重新生成MyMathLib.dll后,使用dumpbin察看输出节:

一般使用extern "C" 实现C++与C及其它语言的混合编程。
如果在C++中引用C语言中的函数和变量,在包含C语言头文件时,或者C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。
在C中引用C++语言中的函数和变量时,比如回调函数,C++的头文件需添加extern "C"。

4).def文件

模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 .def 文件。
.def 文件必须至少包含下列模块定义语句:
文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。
EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。

MyMathLib.h

MyMathLib.cpp

MyMathLib.def

重新生成MyMathLib.dll后,使用dumpbin察看输出节:

当生成 DLL 时,链接器使用 .def 文件创建导出 (.exp) 文件和导入库 (.lib) 文件。然后,链接器使用导出文件生成 DLL 文件。隐式链接到 DLL 的可执行文件在生成时链接到导入库。可以使用dumpbin程序察看可执行文件的输入节。可以看到现在是按序号进行连接了。


分享到:
评论

相关推荐

    Matlab2016a和VS2013混合Dll编程步骤总结

    1. 从Matlab导出.m文件为Dll文件 Step1将Matlab工作路径转为目标.m文件所在文件夹在控制栏输入“mex –setup” 弹出如下说明 Step2点击“mex –setup C++”弹出如下说明看到“MEX configured to ...

    DLL编程深入浅出带源码

    带源代码 1.概论 2.静态链接库 3.库的调试与查看 4.非MFC DLL 4.1一个简单的DLL 4.2 声明导出函数 4.3 DLL的调用方式 4.4 DllMain函数 4.5 __stdcall约定 4.6 DLL导出变量 4.7 DLL导出类 ...6.3 总结

    DuiLib界面库编程总结

    ......\DLL_Debug_2008 ......\..............\UiLib_d.dll ......\..............\UiLib_d.exp ......\..............\UiLib_d.lib ......\..............\uilib_d.idb ......\..............\uilib_d.pdb ....

    BCB调用matlab的dll的方法总结

    使用BCB编写的软件,调用Matlab生成的dll,实现Borland C++ Builder与matlab的混合编程,这是一个demo的文档,可以参考

    java使用dll jni编程详细实例源码(java+vc)

    绝世好资源。 java通过jni操作vc实现的dll,你掌握了么? 这个资源不但包含java代码,vc代码,而且还有个自己总结的note。 一般的demo仅仅hello下,这个例子体现了传参、函数签名、返回值等等。

    Dll编写教程Dll入门必读

    内容是一些通用的编程技术。例如DLL,COM,Socket,多线程等等。这些技术的特点就是使用广泛,但是误解很多;网上教程很多,但是几乎没有什么...我以近几个月来的编程经验发现,很有必要好好的总结一下这些编程技术了。

    CSDN VC编程经验总结

    不下载绝对后悔,里面集合了基础类的知识,和非技术类的知识,还有界面知识。网络编程的经验.进程/线程/DLL..控件经验.和一些数据库的分析、图形处理等等。

    《Delphi 深度编程及其项目应用开发》PDF书及代码

    《Delphi 深度编程及其项目应用开发》 作 者: 李存斌 汪兵 编著 丛书名: 万水软件项目应用与实例开发丛书 出版社: 中国水利水电出版社 出 版: 2002-9----------简 介 本书是在总结作者多年Delphi开发经验的基础上...

    Ring3注入总结及编程实现.rar(内带源代码)

    一、导入表注入 2 二、挂起线程注入 12 三、挂起进程注入 19 四、调试器注入 21 五、注册表注入 28 六、钩子注入 32 七、APC注入 37 ...十、DLL劫持 52 Ring3注入总结 58 关于Ring3下的反注入思路 60

    VC动态链接库编程资料总结

    一篇介绍VC动态连接库编程的文章,里面附带小demo.简单易懂

    Matlab与C_混合编程.pdf

    Matlab与C#混合编程的实现 关于matlab与c#之间一些数据类型的转换的方法,我也曾经写过。总结一下,最主要的是要完成下面几个步骤: 1、同时安装.netframwork与MCR(matlab compile runtime)。这个在装完vs.net与...

    编程高手箴言(推荐)

    梁肇新开发技术总结,值得借鉴 这是我在网上能够找到的最清晰的版本,分享给大家 目录: 第1章 程序点滴 1 1.1 程序≠软件 1 1.1.1 商业软件门槛的形成 2 1.1.2 认清自己的发展 4 1.2 高手是怎样练成的 5 1.2.1 ...

    java 编程入门思考

    A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java...

    Delphi_深度编程

    基础篇结合示例论述了Delphi的深度编程技术,其中包括9章,分别为:理解Windows消息、进程与线程、自定义组件的编写、文件操作、创建DLL应用程序、两层数据库应用程序、多层数据库应用程序、Socket编程、串口编程;...

    编程高手箴言.rar

    本书是作者十余年编程生涯中的技术和经验的总结。内容涵盖了从认识CPU、Windows运行机理、编程语言的运行机理,到代码的规范和风格、分析方法、调试方法和内核优化,内有作者对许多问题的认知过程和透彻的分析,以及...

    精通Windows.API-函数、接口、编程实例.pdf

    13.1 GDI编程接口概述 379 13.1.1 Windows GDI的功能 379 13.1.2 链接库与头文件 380 13.2 设备上下文(DC)、输出操作与图形对象 380 13.2.1 设备上下文类型与关联设备 380 13.2.2 图形对象的作用及与DC的...

    Python灰帽子-黑客与逆向工程师的Python编程之道[简体中文版]

    3.5 总结 第4章 PyDbg——Windows下的纯Python调试器 4.1 扩展断点处理例程 4.2 非法内存操作处理例程 4.3 进程快照 4.3.1 获取进程快照 4.3.2 汇总与整合 第5章 Immunity Debugger——两极世界的最佳选择 5.1 安装...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    jsp编程的一些小技巧总结,绝对实用。包括JSP编程中常用的js技术。 1.JSP编程中常用的js技术 2. 在下拉列表框里选择一个值后跳出新窗口? 3. 在JSP中启动execl? 4. 两级下拉列表框联动菜单? 5. java中如何把一个目录...

    精通WindowsAPI 函数 接口 编程实例

    13.1 GDI编程接口概述 379 13.1.1 Windows GDI的功能 379 13.1.2 链接库与头文件 380 13.2 设备上下文(DC)、输出操作与图形对象 380 13.2.1 设备上下文类型与关联设备 380 13.2.2 图形对象的作用及与DC的...

Global site tag (gtag.js) - Google Analytics