파일 I/O 버퍼에 액세스
[이 페이지와 연결된 기능인 멀티미디어 파일 I/O는 레거시 기능입니다. 그것은 소스 리더에 의해 대체 되었습니다. 원본 판독기는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 멀티미디어 파일 I/O 대신 소스 판독기 사용을 강력하게 권장합니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
다음 예제에서는 I/O 버퍼에 직접 액세스하여 파형 오디오 파일에서 데이터를 읽습니다.
HMMIO hmmio;
MMIOINFO mmioinfo;
DWORD dwDataSize;
DWORD dwCount;
HPSTR hptr;
// Get information about the file I/O buffer.
if (mmioGetInfo(hmmio, &mmioinfo, 0))
{
Error("Failed to get I/O buffer info.");
.
.
.
mmioClose(hmmio, 0);
return;
}
// Read the entire file by directly reading the file I/O buffer.
// When the end of the I/O buffer is reached, advance the buffer.
for (dwCount = dwDataSize, hptr = lpData; dwCount 0; dwCount--)
{
// Check to see if the I/O buffer must be advanced.
if (mmioinfo.pchNext == mmioinfo.pchEndRead)
{
if(mmioAdvance(hmmio, &mmioinfo, MMIO_READ))
{
Error("Failed to advance buffer.");
.
.
.
mmioClose(hmmio, 0);
return;
}
}
// Get a character from the buffer.
*hptr++ = *mmioinfo.pchNext++;
}
// End direct buffer access and close the file.
mmioSetInfo(hmmio, &mmioinfo, 0);
mmioClose(hmmio, 0);
파일 I/O 버퍼에 대한 액세스를 마치면 mmioSetInfo 함수를 호출하여 mmioGetInfo 함수로 채워진 MMIOINFO 구조체의 주소를 전달합니다. 버퍼에 쓴 경우 mmioSetInfo를 호출하기 전에 MMIOINFO 구조체의 dwFlags 멤버에서 MMIO_DIRTY 플래그를 설정합니다. 그렇지 않으면 버퍼가 디스크로 플러시되지 않습니다.