Сбой SoundPlayer в Vista - PullRequest
       24

Сбой SoundPlayer в Vista

2 голосов
/ 17 сентября 2008

Следующий код вызывает прерывистый сбой на компьютере с ОС Vista.

using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
     myPlayer.Play();

Я очень подозреваю, что это тот код, потому что программа дает сбой в середине звукового сигнала или непосредственно перед каждым звуковым сигналом. У меня есть ловушки верхнего уровня для всех ThreadExceptions, UnhandledExceptions в моем домене приложений и try-catch около Application.Run, ни одна из которых не ловит эту аварию.

Есть идеи?


EDIT:

Просмотр событий имеет следующую информацию:

Неисправное приложение [xyz] .exe, версия 4.0.0.0, отметка времени 0x48ce5a74, неисправный модуль msvcrt.dll, версия 7.0.6001.18000, время штамп 0x4791a727, код исключения 0xc0000005, смещение ошибки 0x00009b30, идентификатор процесса 0x% 9, время запуска приложения 0x% 10.

Интересно, что HRESULT 0xc0000005 имеет сообщение:

«Чтение или запись в недоступную область памяти». (STATUS_ACCESS_VIOLATION)

Ответы [ 5 ]

3 голосов
/ 02 января 2009

Собственно, вышеприведенный код (то есть новый SoundPlayer (BEEPPURE)). Play (); грохнулся для меня.

Эта статья объясняет почему и предоставляет альтернативу SoundPlayer, которая работает безупречно:

http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx

1 голос
/ 17 сентября 2008

Программа просмотра событий показывает HRESULT 0xc0000005 «Чтение или запись в недоступную область памяти». (STATUS_ACCESS_VIOLATION)

См. Мое редактирование выше для более подробной информации; повторение этого занимает некоторое время, поэтому я не могу получить свежий аварийный дамп WinDBG в течение некоторого времени.

1 голос
/ 17 сентября 2008

Вы можете использовать WinDBG и перехватывать все исключения первого шанса. Я уверен, что вы увидите что-то интересное. Если это так, вы можете использовать SOS для очистки стека и разместить его здесь, чтобы помочь нам в этом.

Или вы можете использовать Visual Studio, включив ловушку всех исключений. Перейдите в «Отладка», а затем «Исключения» и убедитесь, что вы перехватываете все. Сделайте это вместе с переключением отладчика в смешанный режим (управляемый и неуправляемый).

Получив трассировку стека, мы можем определить ответ.

Процесс не завершается в Windows без исключения. Это там. Кроме того, возможно, вы захотите проверить журнал событий машины, чтобы увидеть, не обнаружилось ли что-либо.

0 голосов
/ 02 октября 2008

Чистое предположение здесь, но проблема может быть в использовании оператора. Ваш код такой (я думаю):

using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{    
    myPlayer.Play();
}

Блок using вызовет Dispose () на myPlayer, иногда до того, как он завершит воспроизведение звука (но редко, потому что звук такой короткий - с более длинным звуком, держу пари, вы можете воспроизводить ошибку каждый раз) , Ошибка может быть результатом того, что Windows API (который упаковывает SoundPlayer) пытается воспроизвести буфер, который уже был удален .NET.

Я думаю, что если вы сделаете это:

SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();

или даже

(new SoundPlayer(BEEPPURE)).Play();

вы больше не увидите ошибку.

0 голосов
/ 17 сентября 2008

Решение состоит в том, чтобы использовать Microsoft.VisualBasic.Devices, который не страдает от этой ошибки. Поскольку это только Vista, а Event Viewer даже удалось на середине сбоя записать сбои (вместо этого у идентификатора процесса 0x **% 9 ** должно быть шестнадцатеричное значение), я обвиняю в новом звуковом коде в Vista.

Кстати, при подключении отладчика VS к процессу сбоя удаленно удалось сначала повесить Visual Studio, а затем вызвать BSOD на моем компьютере, одновременно убивая не отвечающий devenv.exe. Замечательно!

...