感觉本代码有内存遗漏若有一个资源 放入while(1000次)中, 内存只是增加了dwSize;
若有100个资源 放入while(1000次)中, 内存则增加约100*dwSize;/*
按资源的个数增加!不是按循环次数增加!
*//*-------------------------------------添加代码-------------------------------------*/
HRSRC hResInfo = NULL;
HGLOBAL hGloMem = NULL; //内存
HGLOBAL hGloRes     = NULL; //资源
LPVOID pBuffer = NULL; //资源对应的指针
IStream *pstm;

hResInfo = ::FindResource(NULL, _T("P1"), RT_RCDATA); //查找资源  p1是资源名称 
if(NULL != hResInfo)
{
----- DWORD dwSize = ::SizeofResource(NULL, hResInfo); //资源大小----- if(0 < dwSize)
----- {
---------- //CSDN Note:  The handle must be allocated as movable and nondiscardable 
---------- hGloMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_NODISCARD, dwSize+2); //按资源大小分配内存
---------- //此时内存增加了dwSize---------- DWORD dwAlloc = (DWORD)GlobalSize(hGloMem);
---------- //BYTE* pmem = (BYTE*)GlobalLock(hGloMem);---------- hGloRes = ::LoadResource(NULL, hResInfo);//加载资源
---------- pBuffer = ::LockResource(hGloRes);---------- memcpy(GlobalLock(hGloMem), pBuffer, dwSize); //将资源copy到内存中,此时内存 又 增加约dwSize

---------- dwAlloc = (DWORD)GlobalSize(hGloMem);---------- if(NULL != hGloMem)
---------- {
-------------------- if(S_OK != CreateStreamOnHGlobal(hGloMem, TRUE, &pstm)) //建立流对象
------------------------------ MessageBox(_T("Wrong"));
-------------------- }
-------------------- ::FreeResource(hGloRes);
-------------------- pstm->Release();
-------------------- ::GlobalUnlock(hGloMem);
-------------------- ::GlobalFree(hGloMem); //此时只释放了约dwSize, 也就是约遗漏dwSize内存---------- }
}

/*-------------------------------------添加代码-------------------------------------*/

解决方案 »

  1.   

    LoadResource装入的资源是不需要释放的,因为它使用的内存是直接把拥有资源的EXE或DLL文件作为只读的共享内存,资源也在这段共享内存中,每次LoadResource同一个资源只会增加资源的引用计数,资源占用的内存由系统退出时清理。
    GlobalAlloc分配的内存才需要释放,或者由GlobalFree释放,或者由IStream->Release来释放,取决于CreateStreamOnHGlobal的第二个参数。因为你设定的参数是TRUE,所以执行pstm->Release()时就会释放这个内存,不能再调用GlobalFree了,除非把第二个参数设置成FALSE,两种释放代码都需要调用。其实这段代码不需要单独构建一个hGloMem,直接从hGloRes获取IStream指针即可,内存不会增加,也不需要释放,但是IStream->Release是必须的。
      

  2.   

    直接从hGloRes获取IStream指针即可,内存不会增加,也不需要释放,但是IStream->Release是必须的。
    ---------------
    怎么整这个指针啊!指示一下!整两天了!
      

  3.   

    FindResource
    LoadResource
    CreateStreamOnHGlobal(..., FALSE, &pstm)
      

  4.   

    1:
    运行到CreateStreamOnHGlobal(..., FALSE, &pstm) 时提示:/*---------------------------------------------
    Windows 已在 XX.exe 中触发一个断点。其原因可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug。输出窗口可能提供了更多诊断信息
    /*---------------------------------------------2:此时pstm根本没有数据
      

  5.   

    把这个指针设置为成员变量,IStream *pstm; 
      

  6.   

    那就只能单步调试了,看那部返回错误,然后GetLastError看啥错误了。
      

  7.   

    LockResource
    The pointer returned by LockResource is valid until the module containing the resource is unloaded. It is not necessary to unlock resources because the system automatically deletes them when the process that created them terminates.1. LoadResource 
    2. CreateStreamOnHGlobal
    3. FreeResource不需要LockResource,GlobalAlloc等。
      

  8.   

    固执不固执先不说!呵呵!
    若我的图片作为资源加进来,每张5M,100张就500M了!
    若50张,内存使用250M,那也够大的了!
    能不能把它整进虚拟内存呢!
      

  9.   

    资源使用的是共享内存,用的就是PE文件的硬盘映像,这本身也是共享内存的实现原理,只不过它不会在硬盘上创建一个数据交换文件,而是直接把存放资源的PE硬盘文件当作数据交换文件,只不过这段共享内存是只读的。