Составители:
mmioClose ( hmmio, 0 ) ;
return( FALSE ) ;
}
/* выход из вложенного блока data */
if( mmioAscend( hmmio, &mmckinfoData, 0 ) != 0 )
{
ReportError( hWnd, IDS_CANTWRITEDATA );
mmioClose( hmmio, 0 );
return( FALSE ) ;
}
Команда mmioAscend осуществляет переход в конец вложенного блока
data, но при этом мы остаемся в пределах основного блока RIFF.
Следовательно, функция mmioCreateChunk вызывалась три раза, a mmioAscend
- только дважды.
/* при выходе из блока WAVE происходит запись его размера */
if( mmioAscend( hmmio, &mmckinfoWave, 0 ) != 0)
{
ReportError( hWnd, IDS_CANTWRITEWAVE );
mmioClose( hmmio, 0 ) ;
return( FALSE );
}
/* закрыть файл */
mmioClose ( hmmio, 0 ) ;
return( TRUE ) ;
}
Перед созданием каждого вложенного блока мы записываем значение
размера в поле cksize, поэтому подсистема WinMM знает размер блока с самого
начала. Но для первого, родительского, блока мы задали только формат WAVE.
Заключительная команда mmioAscend завершает создание первого блока. Она
вычисляет размер блока и записывает его сразу после метки RIFF
в начале
файла.
Обработка ошибок. Команда mciGetErrorString оперирует только теми
ошибками, которые возвращаются функцией mciSendCommand, а для процедур
ввода/вывода нет эквивалентной функции генерации сообщений об ошибках.
Мы ввели собственные сообщения в файл ShowWave.RC и написали функцию
ReportError, которая отображает эти сообщения.
/*---------------------------------------
REPORT ERROR Выдает сообщение об ошибке
-------------------------------------------*/
static void ReportError( HWND hWnd, int iErrorID )
85
mmioClose ( hmmio, 0 ) ; return( FALSE ) ; } /* выход из вложенного блока data */ if( mmioAscend( hmmio, &mmckinfoData, 0 ) != 0 ) { ReportError( hWnd, IDS_CANTWRITEDATA ); mmioClose( hmmio, 0 ); return( FALSE ) ; } Команда mmioAscend осуществляет переход в конец вложенного блока data, но при этом мы остаемся в пределах основного блока RIFF. Следовательно, функция mmioCreateChunk вызывалась три раза, a mmioAscend - только дважды. /* при выходе из блока WAVE происходит запись его размера */ if( mmioAscend( hmmio, &mmckinfoWave, 0 ) != 0) { ReportError( hWnd, IDS_CANTWRITEWAVE ); mmioClose( hmmio, 0 ) ; return( FALSE ); } /* закрыть файл */ mmioClose ( hmmio, 0 ) ; return( TRUE ) ; } Перед созданием каждого вложенного блока мы записываем значение размера в поле cksize, поэтому подсистема WinMM знает размер блока с самого начала. Но для первого, родительского, блока мы задали только формат WAVE. Заключительная команда mmioAscend завершает создание первого блока. Она вычисляет размер блока и записывает его сразу после метки RIFF в начале файла. Обработка ошибок. Команда mciGetErrorString оперирует только теми ошибками, которые возвращаются функцией mciSendCommand, а для процедур ввода/вывода нет эквивалентной функции генерации сообщений об ошибках. Мы ввели собственные сообщения в файл ShowWave.RC и написали функцию ReportError, которая отображает эти сообщения. /*--------------------------------------- REPORT ERROR Выдает сообщение об ошибке -------------------------------------------*/ static void ReportError( HWND hWnd, int iErrorID ) 85