C++编写DLL文件

  动态链接库DLL文件与EXE文件一样也是可执行文件,但是DLL也被称为库,因为里面封装了各种类、函数之类的东西,就像一个库一样,存着很多东西,主要是用来调用的。调用方式主要分为两种:隐式(通过lib文件与头文件)与显式(只通过DL文件)。

二、为什么使用DLL?

  微软方面一边开源了很多代码,比如MFC的,这些代码是直接暴露在程序员眼皮子底下的,很容易调用,当然也很容易与程序员代码发生突变,业内也称之为“白盒复用”,有一定的优势,但是也有弊端。在此基础上,我们来聊DLL就比较好,DLL将要一系列代码转化成二进制,直接供程序使用,称之为“黑盒复用”。

  动态链接库DLL最大的好处就是节省内存,程序在没有运行到DLL里的函数的时候,DLL里的函数就没有运行,只有在运行到了DLL,才通过DLL的接口函数访问DLL,这样比直接把函数代码写到主题函数,或静态链接库相比,运行的效率有了很大的提高,其次使用DLL文件编程,其更新也比较方便,不需要与程序连接。

三、怎样使用DLL?

(1)首先创建一个空的DLL文件,创建方法:新建-项目-win32控制台程序-然后取个名字-确定-下一步-选择DLL-勾选空白项目。顺利新建了项目。

以下开发环境为visual studio中

  常规dll应该配备的3类文件:

  (1)dll文件:必备

  (2)lib文件:非必备。含有dll函数入口信息,用于隐式加载。

  (3)头文件.h:非必备。在头文件中写好声明(因此是隐式加载),一来方便给人看有哪些东西,二来方便别人用时不用再写一大堆声明。

  文件的摆放位置

  显示加载:只需要把dll放到与可执行文件同一目录下即可

  隐式加载:把dll和lib放到项目文件夹下。或者“右键项目属性---链接器---常规--附加库目录”中添加dll和lib所在文件夹

  extern “C” _declspec(dllimport)

  (1)_declspec是关键字,用于表示该函数、变量时导出、导入的,括号里dllexport意为其将要导出,dllimport意为其将要导入。

  (2)extern “C”用于指定编译器编译后的函数别名,这样使用时才能正确查找到。即对于变量extern int a;这样的直接写为extern “C” int a;即可,函数同理。

  (3)(.def)文件的语法:entryname[=internalname] [@ordinal [NONAME]] [[PRIVATE] | [DATA]]方括号内为可选项。

  (4)共享出去给别人的头文件通常有这样一段(宏变量名随意):

  这样效果:写dll的人先定义宏AAA,编译时函数method当导出,使用dll的人没有定义AAA,于是函数method为导入,方便写好头文件直接共享出去,不用多作修改。

  (5)在vs中,如果使用了非空项目,vs将自动生成如上面所说的“AAA”,并添加到预编译中。该设置保存在.vcxproj类型的文件中,位置在该文件的PreprocessorDefinitions标签中,并且有四个,分别对应debuf,release和x86、x64的组合。想要修改请可以直接去该文件修改相应宏的名字。

  (6)显示加载typedef int (*SUBPROC)(int a,int b);意思为定义一个类型SUBPROC,该类型对应dll的函数原形,但仍然需要强制转换。

  (7)使用时,声明仍然需要添加extern “C”在开头,声明外部函数时没有添加,将导致外部符号找不到连接(实际目的就是要使两个项目的函数别名对应起来。若其中一个交由编译器自主处理可能造成别名不一致)

  (8)如何获取dll中的类的实例?

    假定:把类class A 声写在头文件,实现写在Cpp。

    写一个函数A* getA(return new A();),然后如上述所述导出导入该函数去获取就是。

  (9)DllMain函数是什么?

  dll的函数入口,不写系统自动帮你写,但有可能出现bug。

APIENTRY:api入口。

HMODULE:实际上typedef HINSTANCE HMODULE,而现在32,64位系统上与HINSTANCE没有区别

DWORD:调用dll时系统传入的变量类型。看上面4个case的英文,用途是当进程(线程)加载(卸载)该dll时可以让该dll做一些额外的(初始化、回收指针等)操作。

联系:https://wenku.baidu.com/view/f5e0a06ca45177232f60a2d4.html

原文地址:https://www.cnblogs.com/wjq13752525588/p/11643456.html

时间: 2024-10-13 20:18:04

C++编写DLL文件的相关文章

VC2010编写Dll文件(转)

源:VC2010编写Dll文件 1. 打开VS2010[Flie / New / Project / Visual C++ / Win32 / Win32 Console Application]在下面输入一个名称,比如mydll,然后[OK / Next],然后在Application Type里选择Dll,在Additional Options里选择Exports Symbols,最后点击Finish. 2.在mydll.cpp里面已经有相关的例子模板了.可以照着他的写法写自己的函数.但是注

Win7 VS2015 x64汇编语言编写DLL文件

有点坑记录一下. 首先创建工程时选控制台类型工程,Win32估计就应该选Win32的,反正我测试用的控制台. 然后选DLL类型,除了Empty其他全都去掉. 工程属性,masm勾上. Linker >> Advanced里 Entry Point写上默认的入口函数 DllEntryPoint Linker >> Input里 Module Definition File写上你所用的def文件名 建立asm和def文件,如下 ASM .code DllEntryPoint proc

(c#)如何生成利用vs2012生成动态链接库(dll文件)

如上图,新建项目中选择类库.编写dll文件: 如图: 待编写完成我们需要的类库功能时,接下来是要生成这样一个dll文件.步骤如下.鼠标移动到资源管理器的项目名称上,点击鼠标右键,在弹出的的属性框里选择生成就ok啦! 如图: 是不是so easy呢!!哈哈. 下面让我们来介绍介绍使用动态链接库的好处. 在外面学习编程语言最最开始的时候,我们常常在一个main函数里面写满代码来实现各种功能,这样会使一个mian里面拥堵不堪,而且不利于修改代码,降低了可读性.于是我们使用了方法的调用,将各个功能写成一

反病毒攻防研究第009篇:DLL注入(上)——DLL文件的编写

一.前言 我之前所编写的用于模拟计算机病毒的对话框程序都是exe文件,所以运行时必将会产生一个进程,产生进程就非常容易被发现.而为了不被发现,可以选择将对话框程序创建为DLL文件.这种文件会加载到已有进程的地址空间中,这样就不会再次创建出进程,隐蔽性相对较好,DLL注入也是恶意程序总会使用的手段.这次我带算用几篇文章的篇幅来论述DLL注入的问题,而这篇文章就首先来讨论一下如何把我之前的对话框程序改写为DLL文件. 二.编写对话框DLL程序 这里我依旧使用VC++6.0,创建一个简单的Win32

delphi 基础之三 编写和调用dll文件

delphi 编写和调用dll文件   Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几种情况下,调用DLL 是合理的: 1) 不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销. 2) 当某些内容需要升级的时候,如果使用DLL 只需要改变DLL 就可以了,而不需要把整个程序都进行变动. 3) 由于DLL 是独立于语言的,所以,当不同语言习惯的人共同开

、Dll文件的编写 调用 说明

1>新建Dll文件TestLib.dll 新建Unit文件U_TestFunc U_TestFunc代码如下: unit U_TestFunc; interface uses //尽可能的少uses这样会缩小dll的体积 SysUtils; //求和 function Sum(x1,x2: Integer): Integer; stdcall implementation function Sum(x1,x2: Integer): Integer; stdcall begin Result :=

QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)

最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所以无需兼带其他DLL即可运行.也发现有些用汇编和C封装的,那估计是高手才能编写啊!那怎么办呢?眼看一星期的交货期要到了,由于本人从来没有写过SDK开发包,心里那个着急啊,赶紧想出了三种处理方案. 方案一: 用自己最熟悉的QT来写,毕竟QT也是C++的一种嘛,应该可以和VC通用的.初步实验,你妹啊,调

编写DLL所学所思(1)——导出函数

烛秋  http://www.cnblogs.com/cswuyg/archive/2011/09/30/dll.html 动态链接库的使用有两种方式,一种是显式调用.一种是隐式调用. (1)       显式调用:使用LoadLibrary载入动态链接库.使用GetProcAddress获取某函数地址. (2)       隐式调用:可以使用#pragma comment(lib, “XX.lib”)的方式,也可以直接将XX.lib加入到工程中. DLL的编写 编写dll时,有个重要的问题需要

编写DLL

想想还是把这个记录下吧,虽然不难,但由于平时写得不多,老是搞忘了. 1.我们来编写一个简单的DLL程序. 首先,我们来看下入口函数DllMain().DllMain()有3个参数: (1)hModule:DLL模块的句柄. (2)ul_reason_for_call:DllMain函数被调用的原因.其取值有4种,分别是DLL_PROCESS_ATTACH(当DLL被某进程加载时DllMain被调用).DLL_PROCESS_DETACH(当DLL被某进程卸载时DllMain被调用).DLL_TH