在窗口中显示一幅 JPG 图象。示例代码:
请问:
LPVOID lpBuf指向的内存是如何释放的?
为什么用API分配系统全局共享内存,用申请Byte数组的方式行不行?

void CxxxView::OnDraw(CDC* pDC)
{
::CoInitialize(NULL);  // COM 初始化
HRESULT hr;
CFile file;

file.Open( "c:\\aa.jpg", CFile::modeRead | CFile::shareDenyNone );  // 读入文件内容
DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf = ::GlobalLock( hMem );
file.ReadHuge( lpBuf, dwSize );
file.Close();
::GlobalUnlock( hMem ); IStream * pStream = NULL;
IPicture * pPicture = NULL;

// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
ASSERT ( SUCCEEDED(hr) );

hr = ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
ASSERT(hr==S_OK);

long nWidth,nHeight;  // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
pPicture->get_Width( &nWidth );    // 宽
pPicture->get_Height( &nHeight );  // 高

////////原大显示//////
CSize sz( nWidth, nHeight );
pDC->HIMETRICtoDP( &sz );  // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
pPicture->Render(pDC->m_hDC,0,0,sz.cx,sz.cy,
0,nHeight,nWidth,-nHeight,NULL);

////////按窗口尺寸显示////////
// CRect rect; GetClientRect(&rect);
// pPicture->Render(pDC->m_hDC,0,0,rect.Width(),rect.Height(),
// 0,nHeight,nWidth,-nHeight,NULL); if ( pPicture ) pPicture->Release();// 释放 IPicture 指针
if ( pStream ) pStream->Release();  // 释放 IStream 指针,同时释放了 hMem

::CoUninitialize();
}

解决方案 »

  1.   

     if ( pStream ) pStream->Release();  // 释放 IStream 指针,同时释放了 hMem

    汗,刚才看了半天没看到这句话。
    现在关注第2个问题: 为什么用API分配系统全局共享内存,用申请Byte数组的方式行不行? ...
      

  2.   

      hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
    第2个参数,TRUE表示释放pStream接口是自动清除内存
      

  3.   

    谢谢!
     现在关注第2个问题: 为什么用API分配系统全局共享内存,用申请Byte数组的方式行不行? ...
      

  4.   

    可以,这里是方便用CreateStreamOnHGlobal创建Stream
      

  5.   

    >> 为什么用API分配系统全局共享内存,用申请Byte数组的方式行不行? ...貌似不行。内存管理要求不一样。不知你如何用Byte数组去建立一个 IStream。
      

  6.   


     ::CreateStreamOnHGlobal(NULL, TRUE, &pStream );
     BYTE* lpBuf   =   new   BYTE[dwSize];
     file.ReadHuge( lpBuf, dwSize );
     file.Close();
     pStream->read(lpBuf,dwSize,NULL);
      

  7.   

    自定义分配方式也可以(比如new BYTE[]),但是你需要自己实现一个IStream接口,在Release方法里面调用delete[] this;