下面是DLL 中的一段代码,不过对其中的变量使用范围甚是头疼可以知道的是 var1,p,str 是所有进程(前提是加载了该dll)间共享的
var2 是所有进程中都复制了一个备份,也就是在进程内共享的想知道的是:
new 分配出来的 和 GlobalAlloc分配出来的那段内存 共享范围是什么?
那段内存是存放在DLL 的内存段还是进程的内存段中?
怎么动态分配内存才具有 var1 的共享范围?#pragma data_seg(".mem")
DWORD var1=1;
DWORD* p=NULL;
char * str=NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.mem,RWS")DWORD var2=2;BOOL fun(){
DWORD var3=var2-var1;
if(!p){
p=new DWORD[10];
}
if(!str){
HGLOBAL hRes=::GlobalAlloc(0,10);
str=(char*)::GlobalLock(hRes);
}
}
var2 是所有进程中都复制了一个备份,也就是在进程内共享的想知道的是:
new 分配出来的 和 GlobalAlloc分配出来的那段内存 共享范围是什么?
那段内存是存放在DLL 的内存段还是进程的内存段中?
怎么动态分配内存才具有 var1 的共享范围?#pragma data_seg(".mem")
DWORD var1=1;
DWORD* p=NULL;
char * str=NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.mem,RWS")DWORD var2=2;BOOL fun(){
DWORD var3=var2-var1;
if(!p){
p=new DWORD[10];
}
if(!str){
HGLOBAL hRes=::GlobalAlloc(0,10);
str=(char*)::GlobalLock(hRes);
}
}
解决方案 »
- opengl中球体纹理映射问题
- DEFINE_GUID 是函数?我这咋编译不过去
- TCP下recv和send的问题!
- 困扰几天的tts问题
- 麻烦各位推荐本MFC类库方面的书
- 一个有难度问题,百度搜索不到解决办法,希望得到高手的帮助.
- VC6.0 出现一个莫名其妙的错误.不能搜索了
- 如何让vc中动态创建的控件响应消息事件?
- 急求:VC如何获取Windows Server 2005版本?哪位兄弟有方法砸过来,不胜感激。我的邮箱:[email protected]
- 怎么提高cspreadsheet类里addcell函数写入的效率
- TO ALL->关于程序员的健康问题之电脑辐射
- clistctrl右键代码
当前进程
那段内存是存放在DLL 的内存段还是进程的内存段中?
当前进程的内存段
怎么动态分配内存才具有 var1 的共享范围?
使用共享内存技术
GlobalAlloc是在进程堆空间中。怎么动态分配内存才具有 var1 的共享范围?
使用内存映射文件。
var1,p,str 是所有进程都能取到的,
但很明显p和str所指向的内容是当前进程的。不是所有进程都拥有的
如果new 分配出来的是在 DLL 堆空间 中的内存,是否意味着在任意进程中访问p时都会指向这段地址? 系统在映射DLL内存时是做的怎样的转换? 跟 reg,near,far 有什么关系没?或者只是简单的修改段址呢?
整个进程共享。new分配在dll的运行时堆里,GlobalAlloc分配在进程默认堆里。释放的时候注意了,new的需要在dll内释放。那段内存是存放在DLL 的内存段还是进程的内存段中?
当前进程怎么动态分配内存才具有 var1 的共享范围?
内存映射文件
在任意进程中访问p时都会指向这段地址? 每个加载dll的进程都各自分配了,并非都指向一个地址。系统在映射DLL内存时是做的怎样的转换? 跟 reg,near,far 有什么关系没?
或者只是简单的修改段址呢?
在32位系统下,没有所谓的near,far
一个应用程序加载dll的时候,将dll映射到自己进程空间的一段内存中。
new是在当前进程中分配内存的;GlobalAlloc是分配全局内存,其它进程也可以访问。
“那段内存是存放在DLL 的内存段还是进程的内存段中? ”
动态分配的内存都是在堆中分配的。
“怎么动态分配内存才具有 var1 的共享范围? ”
GlobalAlloc或者CreateFileMapping等方法。
测试了下发现 进程间共享的变量地址开头是10即 0x10XXXXXX
而内存分配的都是00开头 即 0x00XXXXXX所以GlobalAlloc 并不具有进程间共享的范围
When a DLL allocates memory using any of the memory allocation functions (GlobalAlloc, LocalAlloc, HeapAlloc, and VirtualAlloc), the memory is allocated in the virtual address space of the calling process and is accessible only to the threads of that process.A DLL can use file mapping to allocate memory that can be shared among processes. For a general discussion of how to use file mapping to create named shared memory, see File Mapping. For an example that uses the DllMain function to set up shared memory using file mapping, see Using Shared Memory in a Dynamic-Link Library.
但是由于在多个进程加载该DLL时,该DLL可能被映射到不同的地址空间,因此new返回的指针只能在其中1个进程里有效
new出来的内存只能被当前进程访问,其他进程该指针处的内存与其无关。