我写了一个dll,并在这个dll里面: 
hkMsg = SetWindowsHookEx(WH_CBT,(HOOKPROC)GetProcAddress(hHookDll,"MouseHookProc"), hInst,GetWindowThreadProcessId(FindWindow("Class", "目标窗口"),null));在windowsxp和2000里面都能正常将这个dll挂到目标窗口所在的进程上,但在windows98下却不行,在98下没反应,我用CProcess.exe查看,确实该dll没有成功注入到目标进程中。 奇怪的是,即使该dll没有成功注入到目标进程中,但SetWindowsHookEx返回不是0,也就是成功的,用GetLastError返回0也证实了这一点。另外,如果我故意把FindWindow("Class", "目标窗口")换为一个不存在的窗口,程序就会出错了,证明GetWindowThreadProcessId(FindWindow("Class", "目标窗口"),null));还是正确返回了目标进程主线程ID的了。 我也试过把WH_CBT换为别的也不行。 
超纳闷,在网上查,得到的资料都是SetWindowsHookEx支持win98阿,那怎么我都不成功呢? 总结一下,函数执行是成功的,但dll没有注入目标进程。

解决方案 »

  1.   

    good luck,不知道还有没有人有98帮你测试一下,或者有现成的经验供你参考
      

  2.   

    98?很少有人用了吧,上面所提到的函数98应该都是支持的,记得好像98不支持CreateRemoteThread,不知道楼主用没有用到
      

  3.   

    我没用CreateRemoteThread,就用了SetWindowsHookEx,我也查到了CreateRemoteThread是不能用在98的。但居然用SetWindowsHookEx和网上资料说的CreateRemoteThread一样的效果!都是返回正常,可没反应,晕死了。其实很简单,有没有在98里成功用过CreateRemoteThread的呢?
      

  4.   

    其实很简单,有没有在98里成功用过CreateRemoteThread的呢?
    =========
    98根本就不支持这个API,当然不可能会成功了,但是98上用SetWindowsHookEx一定是没有问题,98下的用钩子的软件也很多,可能还是你的代码的事。
      

  5.   


    对不起,我拷贝错了,我是想说:“其实很简单,有没有在98里成功用过SetWindowsHookEx的呢?”
      

  6.   


    对不起,我拷贝错了,我是想说:“其实很简单,有没有在98里成功用过SetWindowsHookEx的呢?”
      

  7.   

    郁闷阿,看过他的:
    http://topic.csdn.net/t/20010727/13/211817.html他是win98下成功,2000下不行,哈哈,但我就2000下行98下不行
      

  8.   

    98下用SetWindowsHookEx肯定是可以的,我觉得还是你代码的问题
      

  9.   

    还是不行,但是发现了一点新情况:
    如果setwindowshookex的第3个参数hInst改为null时,目标进程会出错,提示“该程序执行了非法操作,即将关闭”详细情况大概是“某模块导致无效页操作,然后是一堆看不懂的代码”。不过这时用CProcess.exe(一个可查进程装载的dll的工具)来查,仍然是没有装载到我这个dll文件,会不会是windows98所谓dll只能装载一次?但至少这个情况说明,dll对目标进程的确产生了影响了(使其发生非法操作而关闭,哈哈)。想问下,第3个参数hInst起到什么作用呢?有和没有有什么区别?
      

  10.   

    又有新的进展,最后一个参数使用null时:
    hkMsg = SetWindowsHookEx(WH_CBT,(HOOKPROC)GetProcAddress(hHookDll,"MouseHookProc"), hInst,null); 
    已证实可以拦截到自己进程(即调用该dll的原本的程序,即我编写的程序)的消息并在MouseHookProc中处理。
    照理说最后一个参数的null应该是拦截全局的WH_CBT消息的,可就是拦截不了其它程序的,这个和我在CProcess.exe中查到的结果是一致的(CProcess.exe中只有原始调用了该dll的程序加载了该dll)。