我写了一个hook在dll中,需要向dll中设置一些初始变量值,在共享数据段中
#pragma data_seg(".MYDATA")
共享数据段内容
#pragma data_seg()
此时,当hook到某些特定的消息时,如果这些消息是由调用dll的应用程序触发的,能反映出这些变量已被初始化,但,如果是其他程序触发的,变量则好像没有初始化!
当我加上#pragma comment(linker,"/SECTION:.MYDATA,RWS")
这一句时,就更本反映不出这些变量被初始化了!
我觉得应该是共享数据段设置的问题,但是不知道问题出在哪里,麻烦大家帮帮忙,很急的!

解决方案 »

  1.   

    把相关代码贴出来。http://nowcan.yeah.net
    我是研究BCB的,钩子我做过。
      

  2.   

    #pragma comment(linker,"/SECTION:.MYDATA,RWS")
    这句需要加上~
    还有
    你要共享的数据段需要初始化~
    否则系统会把它放在一个未初始化的段里面~
    就没有意义了~
    如果是空值那就要赋值成NULL~
      

  3.   

    在dll中:
    #pragma data_seg(".MYDATA")
    CString strSoapProcId="";
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:.MYDATA,RWS")
    BOOL __declspec(dllexport)__stdcall SetHwndSoapProcId(CString SoapProcId)
    {
    strSoapProcId=SoapProcId;
    return TRUE;
    }在应用程序中,先调用设置该strSoapProcId变量初值,然后,设置hook,每次触发钩子时,我都把该变量的值绘制到桌面上,但是,每次都得不到想要的结果,总是显示“strcore.cpp”这些东西,根本不是我传进去的值!
    大家帮忙亚!
      

  4.   

    CString strSoapProcId="";
    改成
    CString strSoapProcId=NULL;
    行吗?
      

  5.   

    对了~
    CString不支持吧~
    换成DWORD~
      

  6.   

    我改成DWORD了,还是不行亚,结果显示为0,就是还是初始话的值,
    并没有设置成功?
    大家帮帮忙亚!
      

  7.   

    这样这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。你是不是哪里改了??#pragma data_seg(".MYDATA")
    DWORD strSoapProcId=NULL;
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:.MYDATA,RWS")BOOL __declspec(dllexport) __stdcall SetHwndSoapProcId(DWORD SoapProcId)
    {
    strSoapProcId = SoapProcId;
    return TRUE;
    }
      

  8.   

    CString sz=""实际上好像是不初始化的,=" "或"a"看看
      

  9.   

    我知道你的问题在那里。因为你的共享数据段是在不同的进程间共享的,所以你一定要在DllMain中传进来的那个HINSTANCE hInstance值保存起来,作为你的钩子函数中HINSTANCE参数,这样做的保证你不会出问题。否则你的程序只可能在当前窗口运行良好,当鼠标离开窗口时你就会纳闷。