win32编程中加载dll动态链接库的两种方法
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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);