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();
}
----------------------------------------------------------------------------
리턴되어진 스트림 객체는 트랜잭션을 지원하지 않으며, 영역 잠금을 지원하지 않는다고 하는데(영역 잠금이 뭐지?)
#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();
}
----------------------------------------------------------------------------
댓글
댓글 쓰기