关于DLL中的全局变量(100分)

  • 主题发起人 主题发起人 zh_sh
  • 开始时间 开始时间
Z

zh_sh

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp; 我做了一个键盘的Hook,在DLL中用了一个全局变量来保存调用它的窗体的<br>句柄,在窗体的EnableHook过程中将主窗体的句柄传递给它,没有能实现应有<br>效果,后来用了FindWindow来获得句柄,就取得了成功,后来又发现当窗体处<br>于激活状态时,全局变量与FindWindow的值是一样的,而窗体处于非活动状态<br>时,全局变量的值为0。<br>&nbsp; &nbsp;那位大侠能给我解释一下上面的情况
 
DLL没有自己的数据区,当然不能保证全局变量的值。
 
<br>&nbsp; &nbsp;那为什么当主窗口为活动窗口时,全局变量的值又与主窗口的实际句柄值相等呢?
 
DLL的数据都放在调用过它的Host Application的内存空间里,就是因为这个吧。<br>
 
DLL中用了一个全局变量,你是怎么写的?<br>如是VC:(注意:变量一定要付初值)<br><br>#pragma data_seg(".shdata")<br>HHOOK hMouseHook= NULL;<br>//static HWND hWndMouse = NULL;<br>int nTest=0;<br>POINT tMouseP={0,0};<br>#pragma data_seg()<br><br>#pragma comment (linker,"/section:.shdata,rws")<br>
 
这个问题就是因为每个dll只在系统stack和<br>调用进程stack里面保存有自己的数据,你的<br>全局变量在别的进程里面是找不到的,这时候<br>Windows就到相应的系统stack里面找到了数据<br>段然后把里面的数据进行一个copy到这个进程<br>里面来,而这个参数并没有被初始化。按照<br>Delphi的习惯这些参数会被初始化为0和nil这<br>样得值。<br><br>由于delphi里面没有kill-k说明的开辟自己<br>数据段的手段,解决这个问题的方法是在dll的<br>begin...end.语句块里面创建一个有全局性质<br>的东西(比如说全局句柄),然后把数据放在<br>这个东西里面,通过访问这个句柄来得到与<br>修改数据。<br><br>至于我自己,一般是使用FileMapping的方法来<br>保存这样的数据。<br>
 
张磊说的有理
 
wrench 真无耻!
 
如果可能,用MapFile实现,我前一段时间向高手请教过。MapFile德使用见<br>http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=198085<br>沈前卫 和Pipi.,cAkk等德讨论。
 
仅有用作dde的dll可以有"全局变量",也很特殊.<br>一般是不可以有的.
 
多人接受答案了。
 
后退
顶部