标签:
第一课:来源于_ Po学校 
		动态链接库 
extern "C"//把c++函数转换成c的方式 (也就是函数名不惨料)
概念 :
(窗口)
 findwindow ---存在于 	Uer32.dll
 			kernel32.dll (内核)
当代码用到dll的时候 用它的copy指向 达到节约内存
	dll是一个能被其他程序加载的程序 (如可以让QQ加载自己写的dll)
	操作系统对任何的动态链接库,只会保存一份 (修改将会是全局的)
dll能进行动态调节、动态进行加载
/////////////
	Dllmain //打破只能被调用的命运,从此掌握主动大权
主动:
	case DLL_PROCESS_ATTACH:	//被其他程序加载的时候
	case DLL_THREAD_ATTACH:		//当其他程序有新线程启动的时候
	case DLL_THREAD_DETACH:		//当其他程序某个线程终止(卸载)的时候
	case DLL_PROCESS_DETACH:	//被其他程序卸载
由于ascii不能表示中文,所以就有了unicode,utf-8之类的多字节的字符  L宏就是把ascii的字符串转成多字节的。
MessageBox(NULL, L"DLL被加载!被线程加载", L"I Love..!", MB_OK);	//这句是创建小对话框的
因为dll只能被其他程序加载, 所以不能直接按F5调试	或设为启动项目即可
	
	注意: 	//先找当前文件夹-》如果当前文件夹没有-》我们就去system32下查找-》64位 windows/system32 // 32位 windows/SysWoW64
	360检测不到SysWOW64
	
//user32.dll	->	如果我在他的本地文件里建立一个假的user32.dll	-》	他会不会加载这个假的dll
	//这是DLL劫持	据说以前用的很多 
------------------
	DLL导出函数 、 内部函数
DLL导出函数----》 新建一个项目 dll 勾选导出
加载里面的int fnDllExportDemo(void)函数 HMODULE hModule=::LoadLibrary(L"DllExprotDemo.dll"); //加载的时候写上名字就可以了
使用fnDllExportDemo(void)函数的两种方法:
=======================================================================================
	1.动态链接---
typedef int(*FUNC)(void);//这是一个函数类型
先要知道它的原型:
	//HMODULE相当于当前这个dll的身份证号 定位到dll上面					//L宏就是把ascii的字符串转成多字节的。
	HMODULE hModule=::LoadLibrary(L"DllExprotDemo.dll");	//加载的时候写上名字就可以了
	//先找当前文件夹-》如果当前文件夹没有-》我们就去system32下查找-》64位 windows/system32 // 32位 windows/SysWoW64
	
	if (hModule == NULL)	//当加载不到dll的时候 hModule的值会为空
	{	
		MessageBox(NULL, L"加载DLL失败!", L"I Love mark!",MB_OK);
	}
	FUNC dllFunc=(FUNC)::GetProcAddress(hModule, "fnDllExprotDemo");//使用windows的API:GetProcAddress 获得句柄(把要使用的函数名传进去 会返回一个指针,用刚定义的接住),强转
	printf("%d", dllFunc());	//调用 :比如printf 跟普通函数一毛一样
//当前使用的是c++编译出来的, 它有一个命名粉碎机制
//也就是 c++支持重载,它将你所有的函数名称都加点料
//要使用 得用c的方式进行编译   在
//DLLEXPROTDEMO_API int fnDllExprotDemo(void);	//(DLLEXPROTDEMO_H目录下)
//更改成:
extern "C" DLLEXPROTDEMO_API int fnDllExprotDemo(void);
========================================================================================
	2.静态链接---
	
	1.拷贝它的头文件 ,放在要使用它的工程下面 (当前的也就是LoadDllDemo) 
	2.拷贝它的.lib	,也放在要使用它的工程下面
	3.包含头文件 #include"DllExportDemo.h" 	#pragma comment(lib,"DllExportDemo.lib")
		然后就可以直接调用了 printf("%d",fnDllExportDemo());
typedef int(*FUNC)(void);//这是一个函数类型
//当前使用的是c++编译出来的, 它有一个命名粉碎机制
//也就是 c++支持重载,它将你所有的函数名称都加点料
//要使用 得用c的方式进行编译 在
//DLLEXPROTDEMO_API int fnDllExprotDemo(void);
//更改成:
extern "C" DLLEXPROTDEMO_API int fnDllExprotDemo(void);
------------------------------------------------------------------------------------------------
CreateProcess function	//创建进程函数
-----
//当前使用的是c++编译出来的, 它有一个命名粉碎机制
//也就是 c++支持重载,它将你所有的函数名称都加点料
//要使用 得用c的方式进行编译 在
//DLLEXPROTDEMO_API int fnDllExprotDemo(void);
//更改成:
extern "C" DLLEXPROTDEMO_API int fnDllExprotDemo(void);
---------------------------------
小结:导出函数 无论用哪种方式 都要用extern "C"方式编译
extern"C"  EXPORTDLL_API int fnExportDll(void);	//c模式
#include "stdafx.h"
#include<Windows.h>
#include"ExportDll.h"
#pragma comment(lib,"ExportDll.lib")
typedef int(*FUNC)(void);	//
int main()
{
	//HMODULE hModule = ::LoadLibrary(L"Practicedll_1.dll");	//加载 (这个呢,是没有导出的)
	HMODULE hModule=::LoadLibrary(L"ExportDll.dll");	//加载	(导出的)
	if (hModule == NULL) {
		MessageBox(NULL, L"加载失败", L"Mark", MB_OK);
	}
	//printf("%d", fnExportDll());	//静态导出的 (.h 和lib拷贝到执行程序下)
	
	//********以下是动态链接
	FUNC dllFunc = (FUNC)::GetProcAddress(hModule, "fnExportDll");// 使用windows的API:GetProcAddress 获得句柄 (会返回一个指针)
	printf("%d", dllFunc());
    return 0;
}
 
感谢鹿鸣老师,还有Linda老师 ,还有Mark老师课讲得非常好 通俗易懂而且非常详细!
欢迎加 c++讨论群484983958
Windos_Hook_动态链接库-CreateDllDemo ——第一课 _Po学校
标签:
原文地址:http://www.cnblogs.com/bk668022/p/5892862.html