win32编程中加载dll动态链接库的两种方法

来源:赵克立博客 分类: Win32 标签:C/C++发布时间:2017-11-21 18:19:24最后更新:2017-11-23 09:45:32浏览:1380
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2017-11-23 09:45:32
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

创建一个dll项目

BOOL APIENTRY DllMain( HMODULE hModule, //就是Dll的句柄
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
g_Module = (HINSTANCE)hModule;
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		MessageBox(NULL, "Inject Success!", "1", 0);
		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

dll加载后会弹出一个消息框

然后在HookDll.h中定义并导出一个Hook函数

extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);

编译链接后会生成一个dll文件和lib文件

dll使用方法

第一种

直接包含头文件和lib导入文件后就可以在项目中使用啦,如下

#include"../HookDll/HookDll.h"
#ifdef _DEBUG
#pragma comment(lib,"../Bin/HookDll_d.lib")
#else
#pragma comment(lib,"../Bin/HookDll.lib")
#endif // DEBUG

此方法有个弊端就是如果有大量dll要加载的话,主程序启动的时候会慢,因为dll是主程序启动时就直接加载进去的。

第二种

此种方法是按需加载,需要的时候加载,只不过使用上麻烦一些,需要先找出使用的函数的地址才能使用

HMODULE DllModule = LoadLibrary(_T("HookDll_d.dll"));
if (DllModule == NULL)
{
    printf("cannt find dll\r\n");
    return FALSE;
}
//获取Dll中导出的函数的地址
HOOKPROC   func_Address = NULL;
func_Address = (HOOKPROC)GetProcAddress(DllModule, "_HookProc@12");
if (func_Address == NULL)
{
    printf("cannt found MyMessageProcess");
    return FALSE;
}
//可以使用啦...
//用完后释放资源
FreeLibrary(DllModule);



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python