我想在动态加载的DLL中开一大块内存来存储数据,卸载之前把这些数据传给调用它的EXE,要怎么办啊??
应该是进程私有空间的问题吧,请高手指点,有代码更好!

解决方案 »

  1.   

    1你可以在应用程序中开辟内存,然后把地址传给DLL
    2也可以用SendMessage将内存数据传给应用程序
    3用COM也可以
      

  2.   

    如果直接在DLL里面new块空间的话,在DLL卸载之后这块内存就清空了
    应该是在进程的私有空间里面开空间,
    我想要一段示例代码啊。
    就像HeapAlloc之类的函数吧rivershan(笨猫)(爱情是什么?) 
    共享数据段怎么用呢??
    给段示例代码吧
      

  3.   

    因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。 #pragma data_seg预处理指令用于设置共享数据段。例如:
    #pragma data_seg("SharedDataName")
    HHOOK hHook=NULL;
    #pragma data_seg()
     在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量 将被访问该Dll的所有进程看到和共享。
      

  4.   

    通过CreateFileMapping()创建一个内存隐射文件,注意名字不要为空,exe通过那个名字用OpenFileMapping()打开
    msdn上很清楚的,看看吧,呵呵
      

  5.   

    最有效率的是在exe中new,然后传给dll,其他的效率都要低很多,尤其是大内存块
      

  6.   

    rivershan(笨猫)(爱情是什么?) 
    我不是要在多个进程中共享一个DLL的数据段,
    而是要在一个EXE和它的DLL之间共享一个数据段,
    使EXE在DLL被卸载之后也可以访问该数据段,weirdy(软件设计师)
    最有效率的是在exe中new,然后传给dll,其他的效率都要低很多,尤其是大内存块如果要在EXE中new,必须先确定大小,而这个数据段的大小要在DLL里才能确定,
    要用这种方法,当然也可以在卸载DLL之前,传给EXE一个内存大小的数值
    然后再在EXE中new内存,但这样在同时要有两块一样的内存,增加了对计算机内存大小的要求请各位高手再给指点一下吧
    是否可以用VisualAlloc先预留一大块内存地址呢
    还有HeapAlloc是在进程的私有堆开内存,
    只是不知道如果DLL被卸载后是否会被清空呢,
      

  7.   

    renjing(regine) 
    你所说的用SendMessage的方法是怎么样的呢
    请指点一下吧
    至于com对我来说距离还比较遥远吧
    我只是一个初学者啊
      

  8.   

    除共享段外,DLL中所用堆栈占用的就是EXE的地址空间啊.
    只要是new或malloc分配的,就不会随DLL而清空,但可能有个问题,如果同时存在静态链接与动态链接的你的DLL,则在EXE中释放要出错.最好是在DLL中申请的就在DLL中释放.
      

  9.   

    你可以在应用程序中开辟内存,然后把地址传给DLL。。
    因为你调用的很多系统api也是这样的。比如DWORD GetModuleFileName(    HMODULE hModule, // handle to module to find filename for 
        LPTSTR lpFilename, // pointer to buffer for module path 
        DWORD nSize  // size of buffer, in characters 
       );
      

  10.   

    楼上说的对
    在DLL中直接用EXE中的内存
    这样DLL卸载以后,EXE中仍然可以使用
      

  11.   

    我在DLL中用两次VirtualAlloc分配了一块内存,赋了一个字符串,把这个指针传回到EXE中,
    用TextOut显示出来,在TextOut后调用FreeLibrary可以正常显示,
    但是如果把FreeLibrary放在TextOut的前面就不显示,是怎么回事啊
    用GetProcessHeap,然后用HeapAlloc也是同样
    这些函数到底要怎么用啊??
      

  12.   

    对了我还有一个问题
    按理说在DLL中如果不用
    进行模块转换,应该保持EXE的模块
    但我在DLL的输出函数中调用
    CString ps=AfxGetAppName();
    AfxMessageBox(ps);
    时显示的竟是EXE的App名
    这是怎么回事啊
    我没有调用AFX_MANAGE_STATE(AfxGetModuleState());
    我用的是Regular DLL与MFC静态链接,在EXE中用LoadLibrary
    是不是这个转换在与MFC静态链接的DLL里是自动的啊
    如果要转换回来要怎么办呢
      

  13.   

    在Exe中,预留足够的地址空间, 不申请内存,
    然后把起始地址和进程HANDLE传给dll,当dll在写数据时发现内存不够就用EXE的HANDLE申请页就行了.
    用::VirtualAllocEx(HANDLE hProcess,.......)hProcess是EXE的HANDLE,其它参数查查CSDN就行了。