Доступ к буферу файлового ввода-вывода
[Функция, связанная с этой страницей, мультимедийные операции ввода-вывода файлов, является устаревшей функцией. Она была заменена средством чтения исходного кода. Средство чтения источника оптимизировано для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде средство чтения исходного кода вместо операций ввода-вывода мультимедийных файлов, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
В следующем примере напрямую обращается к буферу ввода-вывода для чтения данных из файла waveform-audio.
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);
Завершив доступ к буферу ввода-вывода файла, вызовите функцию mmioSetInfo , передав адрес структуры MMIOINFO , заполненной функцией mmioGetInfo . При записи в буфер задайте флаг MMIO_DIRTY в элементе dwFlags структуры MMIOINFO перед вызовом mmioSetInfo. В противном случае буфер не будет сбрасываться на диск.