APIのCreateStreamOnHGlobalを利用すると簡単にIStreamを取得できる。COMインターフェースの中にはIStreamでデータを受け取るものがあるのでそういう場合に重宝する。
#include "objidl.h"
//
// グローバルメモリ上に新しくIStreamを作る
//
bool CreateOnHGlobal(IStream** ppIStream)
{
HRESULT hr;
if(ppIStream == NULL)
return false;
hr = ::CreateStreamOnHGlobal(NULL,TRUE,ppIStream);
if(SUCCEEDED(hr) && *ppIStream)
return true;
*ppIStream = NULL;
return false;
}
//
// テスト用関数
//
void Test(void)
{
::CoInitialize(NULL);
bool ret;
HRESULT hr;
IStream* pIStream;
//メモリ上にIStreamを確保
pIStream = NULL;
ret = CreateOnHGlobal(&pIStream);
//IStreamへ10byteデータ書き込み
hr = E_FAIL;
if(ret)
hr = pIStream->Write("1234567890",10,NULL);
if(FAILED(hr))
ret = false;
if(ret)
::MessageBox(NULL,_T("成功しました"),_T(""),MB_OK);
else
::MessageBox(NULL,_T("失敗しました"),_T(""),MB_OK);
if(pIStream)
pIStream->Release();
::CoUninitialize();
}
