ストリーム(IStream)の確実なサイズの取得

(2004.03.25)
    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;
    }
一覧に戻る
© 2003 WAC.com All Right Reserved.