Операционные системы. Марапулец Ю.В. - 85 стр.

UptoLike

Составители: 

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