IMFByteStream::Read メソッド (mfobjects.h)
ストリームからデータを読み取ります。
構文
HRESULT Read(
[in] BYTE *pb,
[in] ULONG cb,
[out] ULONG *pcbRead
);
パラメーター
[in] pb
データを受信するバッファーへのポインター。 呼び出し元はバッファーを割り当てる必要があります。
[in] cb
バッファーのサイズ (バイト単位)。
[out] pcbRead
バッファーにコピーされたバイト数を受け取ります。 このパラメーターを NULL にすることはできません。
戻り値
このメソッドは、成功すると S_OK を返します。 そうでない場合は、HRESULT エラー コードを返します。
注釈
このメソッドは、ストリーム内の現在の位置から最大 cb バイトを読み取り、呼び出し元によって提供されるバッファーにコピーします。 読み取られたバイト数は 、pcbRead パラメーターで返されます。 メソッドは、ファイルの末尾に到達してもエラー コードを返しません。そのため、アプリケーションは、メソッドが戻った後に pcbRead の値をチェックする必要があります。
このメソッドは同期的です。 読み取り操作が完了するまでブロックされます。
実装に関する注意事項:このメソッドは、 pcbRead パラメーターで返される値で指定された読み取られたバイト数を現在の位置に追加することで、ストリーム内の現在位置を更新する必要があります。 現在の位置を更新できるその他のメソッドは、 Read、 Write、 BeginWrite、 Seek、 および SetCurrentPosition です。
このインターフェイスは、Windows Media Format 11 SDK 再頒布可能コンポーネントがインストールされている場合、次のプラットフォームで使用できます。
- Service Pack 2 (SP2) 以降の Windows XP。
- Windows XP Media Center Edition 2005 と KB900325 (Windows XP Media Center Edition 2005) とKB925766 (2006 年 10 月 Windows XP Media Center Edition の更新プログラムのロールアップ) がインストールされています。
例
次の例では、バイト ストリームから呼び出し元割り当てメディア バッファーにデータを読み取ります。 メディア バッファーの詳細については、「メディア バッファー」を参照してください。
// Read data from a byte stream into a media buffer.
//
// This function reads a maximum of cbMax bytes, or up to the size of the
// buffer, whichever is smaller. If the end of the byte stream is reached, the
// actual amount of data read might be less than either of these values.
//
// To find out how much data was read, call IMFMediaBuffer::GetCurrentLength.
HRESULT ReadFromByteStream(
IMFByteStream *pStream, // Pointer to the byte stream.
IMFMediaBuffer *pBuffer, // Pointer to the media buffer.
DWORD cbMax // Maximum amount to read.
)
{
DWORD cbBufferMax = 0;
DWORD cbRead = 0;
BYTE *pData= NULL;
HRESULT hr = pBuffer->Lock(&pData, &cbBufferMax, NULL);
// Do not exceed the maximum size of the buffer.
if (SUCCEEDED(hr))
{
if (cbMax > cbBufferMax)
{
cbMax = cbBufferMax;
}
// Read up to cbMax bytes.
hr = pStream->Read(pData, cbMax, &cbRead);
}
// Update the size of the valid data in the buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->SetCurrentLength(cbRead);
}
if (pData)
{
pBuffer->Unlock();
}
return hr;
}
次の例も同様ですが、データを保持するために新しいメディア バッファーを割り当てます。
//-------------------------------------------------------------------
// AllocReadFromByteStream
//
// Reads data from a byte stream and returns a media buffer that
// contains the data.
//-------------------------------------------------------------------
HRESULT AllocReadFromByteStream(
IMFByteStream *pStream, // Pointer to the byte stream.
DWORD cbToRead, // Number of bytes to read.
IMFMediaBuffer **ppBuffer // Receives a pointer to the media buffer.
)
{
HRESULT hr = S_OK;
BYTE *pData = NULL;
DWORD cbRead = 0; // Actual amount of data read.
IMFMediaBuffer *pBuffer = NULL;
// Create the media buffer.
// This function allocates the memory for the buffer.
hr = MFCreateMemoryBuffer(cbToRead, &pBuffer);
// Get a pointer to the memory buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->Lock(&pData, NULL, NULL);
}
// Read the data from the byte stream.
if (SUCCEEDED(hr))
{
hr = pStream->Read(pData, cbToRead, &cbRead);
}
// Update the size of the valid data in the buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->SetCurrentLength(cbRead);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppBuffer = pBuffer;
(*ppBuffer)->AddRef();
}
if (pData)
{
pBuffer->Unlock();
}
SafeRelease(&pBuffer);
return hr;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | mfobjects.h (Mfidl.h を含む) |
Library | Mfuuid.lib |