CreateStreamOnHGlobal 예제

CreateStreamOnHGlobal() API는 HGlobal 메모리 핸들을 사용하는 stream object를 생성하는 API이다. 여기의 object는 OLE가 제공하는 IStream이다.

리턴되어진 스트림 객체는 트랜잭션을 지원하지 않으며, 영역 잠금을 지원하지 않는다고 하는데(영역 잠금이 뭐지?)

#1(hGlobal) ; GlobalAlloc API가 리턴한 메모리 핸들. 새로운 메모리 핸들이 할당되는거면 NULL이 입력됨. NULL이 입력되지 않는 경우 스트림내용은 메모리 블럭의 현재 내용이다. 

#2(fDeleteOnRelease) ; 스트림 객체가 해제될때 자동적으로 내제 핸들을 free해줄지 가리킴

#3(ppstm) ; 신규 스트림 객체를 받는 포인터 주소

설명 ; 스트림 객체와 연관된 메모리 핸들을 얻기 위해서 GetHGlobalFromStream API가 존재.


메모리 핸들을 넘겨서 IStream 객체를 생성
----------------------------------------------------------------------------

HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, iSize);
LPVOID pImage = ::GlobalLock(hMem);
// pImage operation...
::GlobalUnlock(hMem);

IStream* pStream = NULL;
if( ::CreateStreamOnHGlobal(hMem, TRUE, &pStream) == S_OK )
{

   Image * pImage = Image::FromStream(pStream);
   pStream->Release();
}

----------------------------------------------------------------------------

신규메모리핸들 생성한 후에 메모리 블럭 내용 채움
----------------------------------------------------------------------------

DWORD dwImageSize;
BYTE* pImageBuffer = NULL;
// pImageBuffer 채우기

IStream* pStream = NULL;
if( ::CreateStreamOnHGlobal(NULL, TRUE, &pStream) == S_OK )
{

   ULONG act = 0;
   hr = pStream->Write(pImageBuffer, dwImageSize, &act);
   if( SUCCEEDED(hr) )
   {
      Image * pImage = Image::FromStream(pStream);     
   }

   pStream->Release();
}

----------------------------------------------------------------------------

댓글

이 블로그의 인기 게시물

[WinAPI] 모달리스 다이얼로그 설명

[WinDbg] Debugging a stack overflow

[WinDbg] first-chance, second-chance Exception