下面是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);
}
}

解决方案 »

  1.   

      new 分配出来的 和 GlobalAlloc分配出来的那段内存 共享范围是什么? 
    当前进程
      那段内存是存放在DLL 的内存段还是进程的内存段中? 
    当前进程的内存段
      怎么动态分配内存才具有 var1 的共享范围? 
    使用共享内存技术
      

  2.   

    new 分配的内存是在DLL堆空间中。
    GlobalAlloc是在进程堆空间中。怎么动态分配内存才具有 var1 的共享范围? 
    使用内存映射文件。
      

  3.   

    sorry有点失误
    var1,p,str 是所有进程都能取到的,
    但很明显p和str所指向的内容是当前进程的。不是所有进程都拥有的
      

  4.   


    如果new 分配出来的是在 DLL 堆空间 中的内存,是否意味着在任意进程中访问p时都会指向这段地址? 系统在映射DLL内存时是做的怎样的转换? 跟 reg,near,far 有什么关系没?或者只是简单的修改段址呢?
      

  5.   

    new 分配出来的 和 GlobalAlloc分配出来的那段内存 共享范围是什么? 
        整个进程共享。new分配在dll的运行时堆里,GlobalAlloc分配在进程默认堆里。释放的时候注意了,new的需要在dll内释放。那段内存是存放在DLL 的内存段还是进程的内存段中? 
        当前进程怎么动态分配内存才具有 var1 的共享范围? 
        内存映射文件
      

  6.   

    如果new 分配出来的是在 DLL 堆空间 中的内存,是否意味着
    在任意进程中访问p时都会指向这段地址? 每个加载dll的进程都各自分配了,并非都指向一个地址。系统在映射DLL内存时是做的怎样的转换? 跟 reg,near,far 有什么关系没?
    或者只是简单的修改段址呢?
    在32位系统下,没有所谓的near,far
    一个应用程序加载dll的时候,将dll映射到自己进程空间的一段内存中。
      

  7.   

    “new 分配出来的 和 GlobalAlloc分配出来的那段内存 共享范围是什么? ”
    new是在当前进程中分配内存的;GlobalAlloc是分配全局内存,其它进程也可以访问。
    “那段内存是存放在DLL 的内存段还是进程的内存段中? ”
    动态分配的内存都是在堆中分配的。
    “怎么动态分配内存才具有 var1 的共享范围? ”
    GlobalAlloc或者CreateFileMapping等方法。
      

  8.   


    测试了下发现 进程间共享的变量地址开头是10即 0x10XXXXXX
    而内存分配的都是00开头  即 0x00XXXXXX所以GlobalAlloc 并不具有进程间共享的范围
      

  9.   

    按照 MSDN 的说法(找的很辛苦啊)Dynamic Memory Allocation
    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.
      

  10.   

    DLL通过文件映射将DLL映射到需要的应用程序里 ,为了防止其中一个进程修改DLL中的变量而影响到其他所有的应用程序,所有DLL里的数据都具有COPY-WRITE保护属性,就是说一个应用程序修改DLL中变量的值会先拷贝到进程自己的空间,修改的只不过拷贝的数据而已.要实现DLL进程间共享可以通过共享数据段或者共享内存等方式.
      

  11.   

    是这样的,在DLL中new出来的内存,在DLL的CRT堆里,因此可以被加载该DLL的EXE所访问。
    但是由于在多个进程加载该DLL时,该DLL可能被映射到不同的地址空间,因此new返回的指针只能在其中1个进程里有效
      

  12.   

    Sorry啊,我刚才做了个实验,我的解答是错误的。
    new出来的内存只能被当前进程访问,其他进程该指针处的内存与其无关。