通过把HookDll.dll加载,实现鼠标Hook后,Dll将被系统加载到所有进程的空间中,那么问题就来了,如何让这些Dll都可以调用同一个函数呢(该函数可实现在Dll中,也可以实现在调用该Dll的模块中)?就像共享数据段中可以多个Dll使用同一个变量那样,多个Dll使用同一个函数(注意地址也要相同哦)。
谢谢,请大家踊跃发言,顶者有分。

解决方案 »

  1.   

    我尝试把调用Dll的模块中的一个函数保存在Dll的共享数据段中,但是其他Dll调用该函数地址的时候就会crash,那应该是在其他dll的那个地址并不存在那个函数导致的
      

  2.   

    #pragma data_seg("Shared")
    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);
    }大家有何高见?怎样解决呢?
      

  3.   

    雅克牙医你还在阿,
    那我可否把代码写在另外一个dll中- main.dll,然后 通过main.dll调用hookdll.dll中的sethook函数,同时传入main.dll的HMODULE,然后在每个hookdll.dll通过该HMODULE去GetProcAddress,实现调用呢?
      

  4.   

    比如改成这样:
    #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);
    }大家有何高见?怎样解决呢?
      

  5.   

    这违反了 Windows 的游戏规则.
      

  6.   

    可以共享同一个函数:
    比如 DLL 实现并导出这个函数,
    然后在其他 dll 中导入使用这个函数就可以了 ....但是,
    (注意地址也要相同哦)
    ......
    这个可能么?
      

  7.   

    只要把函数实现在DLL里就可以了~~
    虽然函数在各个进程里的地址可能不同,但在该DLL里调用是没问题的,DLL有ReLocation信息,用于解决重定位问题的~~
      

  8.   

    函数只是代码而已,为什么要在一个地址里?又不是数据,WINDOWS恐怕是不行的.