动态链接库(DLL),能够被程序加载的程序。
创建动态链接库:
工具:VS2013
一:DLL创建与调用:DllMain()函数
第一步:新建项目->win32,项目名:"CreateDllDemo",解决方案名:DllDemo,然后选择DLL,完成。如图:
对上面的dllmain.cpp文件相应位置添加如下代码,用作等会的测试:
第二步:点击解决方案,右键添加新建项目,选择win32控制台应用程序,项目名:LoadDllDemo,然后确定、完成。
第三步:项目LoadDllDemo当做一个程序,用来加载Dll(项目CreateDllDemo)。需要用到windows的API,添加代码如下:
第四步:将两个项目都右键生成。则在解决方案的目录下,就出现了如下文件:
第五步:运行项目LoadDllDemo,或者直接双击上图的LoadDllDemo应用程序,就出现了以下结果:
点击确定后,从加载变成卸载,对应CreateDllDemo中的代码,如图:
当然了,这个实在项目建立后不做任何改变。如果在目录下没有CreateDllDemo.dll,就不会出现这个结果。
程序查找dll顺序:先找当前文件夹,如果当前文件夹没有dll,那么就会去System32中查找。如果是64位操作系统,就是去SysWOW64寻找dll。
Dll劫持:当程序加载一个系统内部的dll文件(以user32.dll为例),如果在程序所在的目录(本地文件夹)中存在user32.dll(相比系统内部,这个是假的。),那么,程序就会加载这个假的dll。这就是dll劫持。
二:导出函数:就是在dll中写的函数,在其他程序里使用。比如CreateProgress()函数,位于Kernel32.dll中。
在上述的解决方案中,新建一个与CreateDllDemo相同的项目,项目名:DllExportDemo。不同的是在选择Dll选项时,还要勾选导出符号。如图;
本地文件夹Debug中,多出来了两个文件:
使用ExportDllDemo中的函数int fnDllExportDemo(void),在项目LoadDllDemo中做如下修改,其他不变:
将函数int fnDllExportDemo(void)做成一个函数指针:
如果直接运行,会失败:
失败原因,当前使用的是C++编译出来的,命名粉碎机制。应该改成C,如下:
然后再将它重新生成。
注:我在LoadDllDemo输出后面添加了一行代码,system("pause"),不然命令提示行闪现就消失了。结果如下:
这样,导出函数就成功了。
恩,暂时就这样,拜拜。
忘了说了,这是我看视频的学习记录。