社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

リソースからストリーム(IStream)を作る関数 - COM

リソースからストリームを作る関数です。
人によっては。。有用かも?

---
?static IStreamPtr CreateStreamFromResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType)
?{
??HRESULT hr = S_OK;
??CModule module(hModule);
??if ((HINSTANCE)module == NULL)
??{
???return NULL;
??}
??HRSRC hRsrc = module.FindResource(lpName, lpType);
??if (hRsrc == NULL)
??{
???return NULL;
??}
??HGLOBAL?hGlobal = module.LoadResource(hRsrc);
??if (hGlobal == NULL)
??{
???return NULL;
??}
??LPVOID pBuffer = ::LockResource(hGlobal);
??if (pBuffer == NULL)
??{
???return NULL;
??}
#if 0
??IStreamPtr spStream = CStreamHelper::SHCreateMemStream();
??if (spStream == NULL)
??{
???return NULL;
??}
??DWORD dwSize = module.SizeofResource(hRsrc);
??DWORD dwWritten = 0;
??hr = spStream->Write(pBuffer, dwSize, &dwWritten);
??if (FAILED(hr))
??{
???return NULL;
??}
??hr = CStreamHelper::Emulete_IStream_Reset(spStream);
??if (FAILED(hr))
??{
???return NULL;
??}
#else
??DWORD dwSize = module.SizeofResource(hRsrc);
??IStreamPtr spStream = CStreamHelper::SHCreateMemStream((BYTE*)pBuffer, dwSize);
??if (spStream == NULL)
??{
???return NULL;
??}
#endif
??return spStream;
?}
?// SHLWAPI 5.0 or later
?// メモリ上にストリームを作成
?static IStreamPtr SHCreateMemStream(const BYTE *pInit = 0, UINT cbInit = 0)
?{
??return CStreamHelper::Emulete_SHCreateMemStream(pInit, cbInit);
?}
?// shlwapi.dll version 5.0 or later 互換
?// CStreamHelper::CreateStream(), CStreamHelper::CreateStreamFromBuffer()と同等
?static IStream *Emulete_SHCreateMemStream(
??const BYTE *pInit,
??UINT cbInit)
?{
??if ((pInit == NULL) && (cbInit > 0))
??{
???return NULL;
??}
??HRESULT hr = S_OK;
??IStreamPtr spStream;
??hr = ::CreateStreamOnHGlobal(0, TRUE, &spStream);
??if (FAILED(hr))
??{
???return NULL;
??}
??if (cbInit > 0)
??{
???ULONG cbWritten = 0;
???hr = spStream->Write(pInit, cbInit, &cbWritten);
???if (FAILED(hr))
???{
????return NULL;
???}
??
???hr = CStreamHelper::Emulete_IStream_Reset(spStream);
???if (FAILED(hr))
???{
????ATLASSERT(0);
???}
??}
??return spStream.Detach();
?}
?// shlwapi.dll version 5.0 or later 互換
?// CStreamHelper::Emulete_IStream_Reset()と同等
?static HRESULT Emulete_IStream_Reset(IStream *pstm)
?{
??if (pstm == NULL)
??{
???return E_FAIL;
??}
??HRESULT hr = S_OK;
??try
??{
???LARGE_INTEGER zeroPos = {0, 0};
???ULARGE_INTEGER streamSize = {0, 0};
???hr = pstm->Seek(zeroPos, STREAM_SEEK_SET, &streamSize);
???if (FAILED(hr))
???{
????return hr;
???}
??}
??catch (...)
??{
???return E_FAIL;
??}
??return hr;
?}
---


■CModule - for Progarammers
http://www.wac-jp.com/programmers/win32/Module.html

投稿日時 : 2005年7月8日 4:14


コメントを追加

タイトル
名前
URL
コメント