一个键盘钩子hook.dll和一个调用它的对话框主程序main.exe,使用传递函数指针的方法在安装钩子时将main.exe中的一个函数fun()指针传递到hook.dll中,并保存。
当main.exe在前台时,hook.dll可以正常执行main.exe中的fun()函数,但是,当main.exe在后台时,也就是不是当前窗口时,hook.dll中就不能调用fun()函数,出现dll中的fun()函数指针无效的问题。请问如何解决?

解决方案 »

  1.   

    办法就是把函数做到DLL中。
    DLL会被加载到进程空间,而EXE则不会,所以当前进程不是MAIN.EXE时,FUN函数的指向将是一个非法地址。
      

  2.   

    晕,拿我的帖子做广告。
    回复人: lonely001(独行客) ( ) 信誉:100  2005-03-27 09:36:00  得分: 0  
     
     
       办法就是把函数做到DLL中。
    DLL会被加载到进程空间,而EXE则不会,所以当前进程不是MAIN.EXE时,FUN函数的指向将是一个非法地址。
      
     
    我也认为可能是这个原因,难道就没有办法得到原主程序中的FUN()函数地址吗?钩子DLL和原主程序之间到底是怎样的一种关系?普通DLL和钩子DLL和主程序的关系应该是不一样的。
      

  3.   

    我想封装一个键盘钩子DLL, 只让dll发送按键消息,所有处理都放在主程序,感觉这样好些,方便后面的开发。我 认为肯定有办法做到,不知哪位大人肯告知?
      

  4.   

    TO 楼主:
    常规的办法是不可能让.EXE中的函数可以让其他程序正常调用的,除非你把你的.EXE加载到系统空间:)不过,楼主也说了,只是想把处理过程放在.EXE中而已,这样就简单很多了嘛。
    首先,DLL只负责从各个进程中取得所要的数据,然后通过进程间通信的方法将这些数据发给.EXE,在你的主程序种集中处理,就OK了啊:)至于进程间通信的办法有很多,比如共享内存、内存映射、WM_COPYDATA等等。
      

  5.   

    嗯,最好把处理放到exe中,dll来传递一些信息好了
      

  6.   

    全局钩子DLL会加载到被钩的进程,如果被钩的进程是main.exe,一切都好说。如果不是,那个进程可能根本没有main.exe中的fun()函数。其次进程空间是隔离的,即使将指针传递,指针的地址八成是非法的。直接使用物理内存进行操作不知道行不行,就算可以也是其烦无比,进程间通讯比较好。