다음을 통해 공유


파일 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 플래그를 설정합니다. 그렇지 않으면 버퍼가 디스크로 플러시되지 않습니다.