我在动态库全局函数setHookProc中调用SetWindowsHookEx安装一个鼠标钩子,回调函数正常工作!但是当setHookProc执行完毕跳出后,回调函数就不工作了!什么原因?
注意:98下安装VC后,一切正常。卸载VC就会出现上述问题.

解决方案 »

  1.   

    #pragma data_seg("mydata")HINSTANCE glhInstance=NULL; //DLL实例(或者说模块)的句柄。
    HHOOK hMouseHook=NULL;  //鼠标钩子的句柄。
    HWND mywnd=NULL;
    unsigned char bIcon = 1;
    #pragma data_seg()
    ///////////////////////////////
    BOOL setHookProc(HWND hWnd)
    {
    BOOL bResult=FALSE;

    CRect rcDlg;
    GetClientRect(hWnd,rcDlg); nDlgHeight = rcDlg.Height();
    hMouseHook  = SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL); if(hMouseHook!=NULL) {
    bResult=TRUE;
    } mywnd=hWnd; TRACE("钩子安装完毕");
    return bResult; 

    }
    ////////////////////////////回调函数
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
       TRACE("回调函数正常工作\r\n");
       return CallNextHookEx(hMouseHook,nCode,wParam,lParam);}//////////////////////////////////////////////////
    开始正常工作,有输出“回调函数正常工作”,但是当跳出函数后,输出一个“钩子安装完毕”后,就不再
    输出任何信息了。说明回调函数不工作了。///////////////////执行结果如下  /////////////////////
    /////////////////WINDOWS 2000下/////////////////////
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    钩子安装完毕
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    ......
    .....
    ......
    ////////////////////windows 98下///////////回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    回调函数正常工作
    钩子安装完毕
    ///////////////////////////////////////////////////
    ///////////////////////////////////////////////////
    恳请高手指教!
      

  2.   

    设置一下#pragma comment(linker,"/Section:mydata,rws") //设置全局共享数据段的属性
      

  3.   

    hMouseHook  = SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
      

  4.   

    共享段应该这样设:
    #pragma data_seg("mydata")HINSTANCE glhInstance=NULL; //DLL实例(或者说模块)的句柄。
    HHOOK hMouseHook=NULL;  //鼠标钩子的句柄。
    HWND mywnd=NULL;
    unsigned char bIcon = 1;
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:mydata,rws") 
      

  5.   

    http://community.csdn.net/Expert/topic/3507/3507600.xml?temp=.3326837
      

  6.   

    #pragma comment(linker,"/SECTION:mydata,rws") 
    增加读写共享
      

  7.   

    问题解决了,把MFC42d.dll 等6个动态联接接库拷贝到system32下就行了。或者编译时选择加载连接库为静态加载,全编译进去也可以.