通过把HookDll.dll加载,实现鼠标Hook后,Dll将被系统加载到所有进程的空间中,那么问题就来了,如何让这些Dll都可以调用同一个函数呢(该函数可实现在Dll中,也可以实现在调用该Dll的模块中)?就像共享数据段中可以多个Dll使用同一个变量那样,多个Dll使用同一个函数(注意地址也要相同哦)。
谢谢,请大家踊跃发言,顶者有分。
谢谢,请大家踊跃发言,顶者有分。
解决方案 »
- VC中添加cpp和头文件以后程序编译不通过
- ReportCtrl中每行Item中第一列subitems用checkbox代替,第2列中subitems是Icon,第3列中subitems是文字,就像QQ面板中的那样,怎样实现?
- 想做一个对话框,对话框里放一listctrl控件,控件里显示某一程序的快捷方式,象网吧的一样,如何做,大哥们!
- 如何将ListView的标头贴上自己的位图
- 一条业务逻辑数据分别保存到两个数据库,用两个模块分别进行,如何保证这条业务逻辑数据的完整性?
- 怎么在鼠标右键 单击CTreeCtrl中的项的时候,弹出不同的菜单?
- 求可以视频聊天的聊天室和网址,以作编程参考
- 在Win2K下,如何正确使用一个SDK函数[IsPwrShutdownAllowed()]
- DBGrid 控件如何使用谢谢 !
- 局部钩子捕获ALT组合键失败
- 郁闷,Visual Studio.net 2003 还是装不上去!
- 想学HOOK编程了
void* g_pfnCallback = NULL;
HHOOK g_hMouseHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")DllMain(...)
{
// 一些初始化代码,就不必写了
}
LRESULT WINAPI MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(.../*比如特定的条件*/)
{
typedef void(*PFNTEST)(void);
PFNTEST FunTest = (PFNTEST)g_pfnCallback;
g_pfnCallback(); //如果该Dll位于其他进程中,将导致崩溃
}
return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}HRESULT WINAPI SetHook(void* pfnCallback)
{
g_pfnCallback = pfnCallback;
SetWindowsHookEx(WH_MOUSE, MouseProc, g_hModule, 0);
}大家有何高见?怎样解决呢?
那我可否把代码写在另外一个dll中- main.dll,然后 通过main.dll调用hookdll.dll中的sethook函数,同时传入main.dll的HMODULE,然后在每个hookdll.dll通过该HMODULE去GetProcAddress,实现调用呢?
#pragma data_seg("Shared")
//void* g_pfnCallback = NULL;
HHOOK g_hMouseHook = NULL;
HMODULE g_hMainModule = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")DllMain(...)
{
// 一些初始化代码,就不必写了
}
LRESULT WINAPI MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(.../*比如特定的条件*/)
{
typedef void(*PFNTEST)(void);
PFNTEST FunTest = (PFNTEST)GetProcAddress(g_hMainModule, "TestFun");
g_pfnCallback(); //如果该Dll位于其他进程中,将导致崩溃
}
return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}HRESULT WINAPI SetHook(HMODULE hMainModule)
{
g_hMainModule = hMainModule
SetWindowsHookEx(WH_MOUSE, MouseProc, g_hModule, 0);
}大家有何高见?怎样解决呢?
比如 DLL 实现并导出这个函数,
然后在其他 dll 中导入使用这个函数就可以了 ....但是,
(注意地址也要相同哦)
......
这个可能么?
虽然函数在各个进程里的地址可能不同,但在该DLL里调用是没问题的,DLL有ReLocation信息,用于解决重定位问题的~~