请教下关于全局变量。
最近一直来论坛请教,多谢各位高人了。
问题是这样的:
比如我有个DLL,里面有全局的变量。
然后我在一个进程的线程中加载这个DLL。
那DLL里面的全局变量是可以被进程的所有线程使用。
还是说只能被加载DLL的线程使用。
所有线程共享进程的地址空间。
我感觉是DLL中的全局变量可以被所有线程访问的。
但感觉又不对。
因为这样的话,那不是一个DLL多次加载,进程有重名的全局变量了。
还望高人赐教。
多谢。
[解决办法]
DLL被调用时,会被整个映射进调用进程的虚拟地址空间。
变量在内存中是不存在"名字"这个概念的,
变量只是一断内存空间而已,
非const声明的变量,其内存会被生命在可读可写的内存页中。
所以对于你的调用进程来讲,只要会的了DLL中的变量地址
那就可以随意使用此变量了。
[解决办法]
同一个模块你没法多次加载。
只要调用的地方知道DLL中的变量地址,
那么就可以使用此变量。
[解决办法]
[解决办法]
多次加载同一个动态库,动态库中的静态变量或者全局变量也只会有一份
[解决办法]
自己用
Process Explorer http://technet.microsoft.com/zh-cn/sysinternals/bb896653
和
VMMap http://technet.microsoft.com/zh-cn/sysinternals/dd535533
看吧。
[解决办法]
DLL里面有全局的变量,有些特殊,因为有些变量是共享的,就是说只要有其它程序加载了DLL
某个加载DLL的程序推出了,那个全局变量还在;
如果这个程序两次加载同一DLL那个全局变量,并不会重新初始化!!
如果这个变量不是共享的,一个程序只有第一次加载初始化这个变量!!
如果卸载DLL再次加载会重新初始化这个变量,如果卸载前两次加载只有一次初始化这个变量
最后一次卸载,(在没有其他程序加载这个DLL的情况下)这个变量会变得不可用!!
关键是1)是否共享变量
2) 加载卸载顺序,同一个DLL同一个程序连续加载任意次,只会分配到同一地址空间!!!
如果加载后又卸载则次数相同时,变量会变得不可用!!
3)DLL中的变量和线程关系不大!!!
DLL导出的所有名字,加载时会导入到程序的导入数据地址表中或导入函数地址表中的;
这样名字就可用了,
一个程序连续加载DLL任意次,只会有一次进行修改导入表的工作,其他时候
只会返回DLL模块的句柄,实际上Windows的模块的句柄就是模块加载在程序中的虚拟地址。