我在 dll 中设了一个全局变量 tt , 程序通过SetFuncPtr()函数将其设置为 1, 在鼠标钩子函数MouseProc()中检测它,但是当鼠标在本程序窗口中移动时, 通过MouseProc()检测到的tt值为 1,但当鼠标移动别的窗口上时, tt 的值为 0, 如果不在SetFuncPtr()函数中将其设置为 1,而是通过InitInstance() 将其置为 1, 但无论鼠标在哪个窗口tt值都为1,我不明白,为什么会这样呢,难道在全局变量的赋值只能在InitInstance()中,这应该不可能吧!请各位一定要帮帮忙,先谢啦!int tt ;
//以上是我在dll中设的一个全局变量
BOOL CDllMouseApp::InitInstance() 
{  AFX_MANAGE_STATE(AfxGetStaticModuleState());
   hIns = AfxGetInstanceHandle();
   return TRUE;
//  tt = 1;  //如果在这个函数中对tt赋值,则正确
}void DLLEXPORT CALLBACK  SetFuncPtr(PFNMSG pFunc, CWnd* pWnd)
{
  ...
   tt = 1;  //在这个函数中对tt赋值,则鼠标不在本窗口上时 tt == 0,为什么会这样??
}LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
         .....
         CString str;
if( nCode == HC_ACTION){
if( tt )
str= "1" ;
else
str = "0"; AfxMessageBox(str);
}
         //以上是用来测试 tt ==1, 还是 tt == 0;
return CallNextHookEx(hook, nCode, wParam, lParam);
}不但如此,如果再定义一些其它 变量也是这种情况,不明白

解决方案 »

  1.   

    把debug等编译产生的干掉,重来,或rebuild all下试试
      

  2.   

    dingpiao(丁飘) 
            不行啊!不知你们有没有用过全局变量呢,会出现这样的问题吗?
      

  3.   

    dll的内存属于dll所属的进程,因此在本程序中有效,在其它程序则无效,初始化为0了
    可以用#pragma data_seg设置共享数据段,在共享数据段中定义你的tt变量就没问题了
      

  4.   

    楼上说的对,必须用共享数据段
       #pragma data_seg(".shared")
       int tt=0;
       #pragma data_seg() 
       #pragma comment(linker, "/SECTION:.shared,RWS")
      

  5.   

    to:     goodboyws(深夜不眠者)
      
    还是不行啊!情况和之前一样。
      

  6.   

    为何不用信号量(Semaphore)或者互斥量(Mutex)?那可是真正全局的说