HOOK hHook = SetWindowsHookEx(WH_GETMESSAGE,HookQQProc,hHookInstance,ThreadID);LRESULT CALLBACK HookQQProc(int nCode,WPARAM wParam,LPARAM lParam)
{
n = n + 1;
int m = 100;
return 1;}没用DLL,ThreadID是指定的ID,HOOK正确返回,其中n是全局变量,9x下连接的时候说debug.exe无法写入,在win2k下可以执行,但被告知无法读取这个全局变量,出错。无法调试,直接跳出。弄了一个下午一个早上。百思不得其解。请帮忙指点一下。万分感谢。100分送上

解决方案 »

  1.   

    没用DLL?那只能HOOK自己的消息吧.不能HOOK别人的消息吧.
      

  2.   

    是这样的,在dll里面定义全局变量,要用
    #pragma data_seg(".share")  // must be difined as SHARED in .def file
    int n;
    #pragma data_seg()
    #pragma comment(linker, "/section:.share, rws")
    上面是为了在各进程之间增加一个共享数据段否则,在callback函数里定义的变量只在当前进程中有效
      

  3.   

    ThreadID = 0全局钩子,但钩子函数必须做到dll中,如果没做到dll中,不能形成全局钩子,我测试是这样的,不知道有没有高人能做到。ThreadID = 本线程,肯定是线程钩子
      

  4.   

    补充一下,dll里面的代码段,也就是code segment是被各个进程共享的,也就是说每个进程都要把dll得code seg映射到自己的进程空间。但是数据段是各个进程自己控制的,不受别的进程影响,所以从dll映射过去的数据段没有任何意义,只是一堆无意义的2进制码。所以要另外设定一个共享段shared seg
      

  5.   

    看错了,没用dll汗可能是int m = 100;的原因,把这句注释了试试看n要在callback函数外定义
      

  6.   

    ThreadID = 0全局钩子,但钩子函数必须做到dll中,如果没做到dll中,不能形成全局钩子。
    ThreadID = 本线程,肯定是线程钩子
    我赞成wangweintk(枫杨) 的说法!
      

  7.   

    ThreadID = 0全局钩子,但钩子函数必须做到dll中,如果没做到dll中,不能形成全局钩子。
    ThreadID = 本线程,肯定是线程钩子
    我赞成wangweintk(枫杨) 的说法!
      

  8.   

    ThreadID = 本线程 ,肯定是线程勾子。是不是我的理解有问题。我对线程勾子的理解为。可以监视其他线程,即我在本进程可以指定其他进程里的线程,然后监视它?,是不是我这样理解不对?。还是线程勾子只能监视本进程所创建的线程?
      

  9.   

    如果是其它进程的线程,那么钩子函数要做到dll中的。道理很简单,钩子函数相当于一个回调函数,它应该和调用者在同一个地址空间。所以需要用dll来注入到其他的进程中。当然也有些例外,如WH_JOURNALRECORD类型的钩子函数可以在exe中,但它可以钩其它进程线程的消息。