DLL核心编程

Wesley13
• 阅读 641

      现在只要做关于dll,为了dll有更好的应用以及跨平台,一般采用自己写,不用系统的生成!不管用dll做什么事情,如一般用在大型项目软件中或为3D引擎的dll,都采用自己编,我把这段代码放出后可能很多人觉得这个太简单了,但是越是简单的东西越不简单,我记得我以前和别人就讲hello,world的c程序,我讲了五个小时还没讲完。并且这也是所有的dll的基石。弄明白它是何等的重要。

.h 文件

#ifdef JUNO_EXPORTS

首先解释下XXX_ EXPORTS宏,这个宏如果大家不用自动生成的话,会发现它是自动生成的,根据字面上的意思是导出的意思。大家也不会太去关注它了,但是我想在这里说的是这个宏在dll文件里,起着非常重要的作用。一.它会判断是外部申明,还是内部申明如果是在dll中就用export,在应用程序就用import(这个是由编译器判断),二. DLL 中的所有文件都是用命令行上定义的 xxx_EXPORTS 符号编译的。并且XXX必须与项目名一致,否则报错,原因就是此DLL 中的所有文件都是用命令行上定义的 XXX_EXPORTS符号编译的,并且与windows内部机制和编译器定义有关。

#define JUNO_API __declspec(dllexport)

这个是导出dll函数(这里是使用MFC提供的修饰符号_declspec(dllexport)),这个是外部项目的引用 (XXX _declspec(dllexport)里面的XXX可以任意定义,只需要保证这个宏修饰这个宏修饰的类/变量/函数与其对应就ok,不过从变量命名角度上看,就与系统自动生成的规范命名就好)

#else

#define JUNO_API __declspec(dllimport)

内部库的引用

#endif

JUNO_APIvoid CALLBACK DllFoo(void);

.cpp文件

hmodle是库被调用的时候,传过来的指向自己的句柄

ul_reason_for_call库被调用的原因

lp就是系统保留的一个参数

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:如果不是第一次调用,就不会再调用dllmain,只会曾加其次数

case DLL_THREAD_ATTACH:线程的调用,与最大的区别就是它会每一次重新掉用dllmain

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:在有freelib函数 或dll接触映射的时候被调用

break;

}

return TRUE;

}

JUNO_API void CALLBACK DllFoo(void)

{

MessageBox(NULL,TEXT("This function is exported from a DLL"),TEXT("DllFoo"),MB_OK);

return ;

}

其实  我为什么还要说这,因为我现在的3D引擎就是在这个代码的基础上建立起来的!也准备过段时间开源,也想准备连续讲解如何开发引擎的步骤!让中国在这个产业有更好的发展!

点赞
收藏
评论区
推荐文章
Ustinain Ustinain
3年前
关于我想要编写dll文件这件事
0x1前言首先我们要用C、C编写dll,肯定是需要一个合适的编写软件,什么!?你不知道什么是dll,那你这有必要去看看我得上一篇了虽然篇幅不长,但是可以让你对dll有个大致得印象,由于本人用的CLion2019的版本的,至于为什么不用VS,因为里面配置过于繁琐,很不友好,CLion安装包以及破解群文件都有,可以去下载直接使用。话不多说,进入今天
Ustinain Ustinain
3年前
初识动态链接库(DLL)
初识DLLDLL是DynamiclinkLibrary的缩写以为动态链接库。在Windows中,许多的应用程序并不是一个完整的可执行文件,会被分成一些相对独立的动态链接库,如DLL文件,放置于系统中比如:Windows系统是许多动态链接库(DLL)组成的是Windows最基本的应用程序但我们执行运行某一个应用程序的时候,相应的DLL文件就会被程
Ustinain Ustinain
3年前
利用CreateRemoteThread( ) 实现远程线程注入
前言首先想法是强制创建一个目标进程的线程,把我自己的恶意DLL加载进去被注入的DLL拥有目标进程内存的访问权限,所以我们可以通过该向某个进程注入DLL时的方法主要有以下三种:•创建远程线程(CreateRemoteThread()API)•使用注册表(AppInitDLLs值)•消息钩取(SetWindowsHookEx())小试牛刀目前尝试第一
Aimerl0 Aimerl0
3年前
WPS2010版本DLL劫持漏洞复现(plgpf.dll)
WPSOfficeplgpf.dllDLL劫持漏洞原理简单说就是exe文件寻找DLL库会优先在当前目录下寻找,若DLL库未经过校验或者寻找DLL路径不是绝对路径,容易导致DLL被本地攻击者劫持漏洞描述CVE编号:CVE20105208WPSoffice套件应用程序在加载外部库(DLL)时通过了一个不合格
李志宽 李志宽
3年前
干货:木马DLL实现热更新的骚批操作
以前开发木马有个需求:木马是一个DLL文件,DLL需要注入到某个进程常驻,该DLL具备自我升级能力,当发现新的可用版本时,立即Free自己,加载新的。下面是我的一个实现方案:开启一个监听线程,从网络上拉新的可用版本,下载放到一个临时目录,如果发现需要升级,则立即FreeLibrary自身,然后执行更新过程。由于FreeLibrary之后当前模块的内存区域已经
Wesley13 Wesley13
3年前
MFC DLL 导出函数的定义方式
一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解。要学习,这篇文章先总结DLL的导出函数的方法。1.首先说一下如何建立一个普通的DLL工程!(以VS2008为例)NewProject  Win32标签
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
Java通过JNI的方式调用C
1、调用原理用java的javah命令将javanative方法编译成.h,在C程序中调用此.h文件,并实现.h文件里面声明的方法,编译生成.dll文件,最后java通过System.loadLibrary()加载.dll文件,调用具体的方法实现;2、具体操作步骤:1、编译JAVA类publicclassTes
Wesley13 Wesley13
3年前
2014百度校园招聘软件研发类笔试(深圳)
时间:2013年9月28日。地点:深圳职位:软件研发问答题:(10\3)1.动态链接库(DLL)与静态链接库(lib)的优缺点:静态链接库和动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都全部被直接包含在最终的EXE文件中,若使用DLL,该DLL不必被包含在最终的EXE中,EXE文件
Wesley13 Wesley13
3年前
VC++ 函数指针实现被动传输数据
    在使用VS2010开发项目时,经常需要实现一些动态的DLL库的开发,其在开发过程中,需要dll能自动调用回调函数,实现数据传输。因此,在项目中,需要使用到函数的指针,函数的指针能很好的解决该问题。下面采用socket的通信为例。    在我们认知的socket的通信模型中,其采用cs经典模型,为了使我们的代码具有更好的可移植复用性,一般讲,s