static DWORD GetStreamSize(IStreamPtr spStream)
{
if (spStream == NULL)
{
ATLASSERT(0);
return 0;
}
HRESULT hr = S_OK;
hr = CStreamHelper::RewindSeekPosition(spStream);
if (FAILED(hr))
{
ATLASSERT(0);
return 0;
}
#if 0 // この方法ではXMLDOMからサイズが取れない
// サイズの取得
LARGE_INTEGER zeroPos = {0, 0};
ULARGE_INTEGER StreamSize = {0, 0};
hr = spStream->Seek(zeroPos, STREAM_SEEK_END, &StreamSize);
if (FAILED(hr))
{
ATLASSERT(0);
return 0;
}
return (DWORD)StreamSize.QuadPart;
#else
DWORD dwSize = 0;
for (dwSize = 0; ; dwSize++)
{
BYTE cTemp;
ULONG ulRead = 0;
hr = spStream->Read(&cTemp, 1, &ulRead);
if (hr != S_OK || ulRead == 0)
{
break;
}
}
return dwSize;
#endif
}
// シーク位置を先頭に戻す
static HRESULT RewindSeekPosition(IStreamPtr spStream)
{
if (spStream == NULL)
{
ATLASSERT(0);
return E_FAIL;
}
HRESULT hr = S_OK;
// 先頭に戻す
LARGE_INTEGER zeroPos = {0, 0};
ULARGE_INTEGER StreamSize = {0, 0};
hr = spStream->Seek(zeroPos, STREAM_SEEK_SET, &StreamSize);
if (FAILED(hr))
{
ATLASSERT(0);
return hr;
}
return hr;
}