2015-06-14 2 views
0

Мое приложение получает AccessViolationException при вызове конструктора по умолчанию класса Windows.Media.SpeechSynthesis.SpeechSynthesizer. Это происходит только на одной конкретной машине (по крайней мере, до сих пор), которая представляет собой Surface Pro 3 под управлением Windows 8.1. Все остальные машины с установленным приложением не испытывают этой проблемы.AccessViolationException в Windows.Media.SpeechSynthesis.SpeechSynthesizer constructor

Мой код-то вроде этого:

class Speech 
{ 
    private Windows.Media.SpeechSynthesis.SpeechSynthesizer _Synthesizer; 
    public Speech() 
    { 
     SetVoice(); 
    } 

    private void SetVoice() 
    { 
     try 
     { 
      // Exception is raised here 
      _Synthesizer = new Windows.Media.SpeechSynthesis.SpeechSynthesizer(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 
} 

трассировка стека, который появляется в журналах событий выглядит следующим образом:

Description: The process was terminated due to an unhandled exception 
Exception Info: System.AccessViolationException 
Stack: 
    at Windows.Media.SpeechSynthesis.SpeechSynthesizer..ctor() 
    at ... Speech.SetVoice() 
    at ... Speech..ctor() 

Я захватил файл дампа с помощью ProcDump и можете увидеть это в стеке (он не показывает «мой код» только код после него):

sapi.dll!CSpObjectTokenEnumBuilder::CheckTokenSignature(struct ISpDataKey *) Unknown 
sapi.dll!CSpObjectTokenEnumBuilder::AddTokensFromDataKey(struct ISpDataKey *,unsigned short const *,unsigned short const *) Unknown 
sapi.dll!CSpObjectTokenCategory::InternalEnumTokens(unsigned short const *,unsigned short const *,struct IEnumSpObjectTokens * *,int) Unknown 
sapi.dll!CSpObjectTokenCategory::EnumTokens(unsigned short const *,unsigned short const *,struct IEnumSpObjectTokens * *) Unknown 
Windows.Media.SpeechSynthesis.dll!SpEnumTokens(unsigned short const *,unsigned short const *,unsigned short const *,struct IEnumSpObjectTokens * *) Unknown 
Windows.Media.SpeechSynthesis.dll!Windows::Media::SpeechSynthesis::InstalledVoicesStatic::get_AllVoices(struct Windows::Foundation::Collections::IVectorView<class Windows::Media::SpeechSynthesis::VoiceInformation *> * *) Unknown 
Windows.Media.SpeechSynthesis.dll!Windows::Media::SpeechSynthesis::InstalledVoicesStatic::get_DefaultVoiceWithRank(struct Windows::Media::SpeechSynthesis::IVoiceInformation * *,unsigned int *) Unknown 
Windows.Media.SpeechSynthesis.dll!Windows::Media::SpeechSynthesis::CSpeechSynthesizer::GetDefaultVoice(struct Windows::Media::SpeechSynthesis::IVoiceInformation * *,unsigned int *) Unknown 
Windows.Media.SpeechSynthesis.dll!Windows::Media::SpeechSynthesis::CSpeechSynthesizer::CreateSynthesizerObject(void) Unknown 
Windows.Media.SpeechSynthesis.dll!Windows::Media::SpeechSynthesis::CSpeechSynthesizer::RuntimeClassInitialize(void) Unknown 
Windows.Media.SpeechSynthesis.dll!Microsoft::WRL::Details::MakeAndInitialize<class Windows::Media::SpeechSynthesis::CSpeechSynthesizer,class Windows::Media::SpeechSynthesis::CSpeechSynthesizer>(class Windows::Media::SpeechSynthesis::CSpeechSynthesizer * *) Unknown 
Windows.Media.SpeechSynthesis.dll!Windows::Media::SpeechSynthesis::InstalledVoicesStatic::ActivateInstance(struct IInspectable * *) Unknown 

Его реальный Странно, что ошибка, похоже, ускользает от блока try/catch. Это только на машине одного клиента

Любые идеи, что происходит?

ответ

1

Я считаю, что ваш клиент имеет плохие данные в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Speech\Voices\Tokens, в котором SAPI хранит информацию о том, какие голоса установлены в системе.

Очевидно, что некоторые ключи присутствуют (учитывая, что код пытается добавить токен из раздела реестра), но значения повреждены, в результате чего AV в собственном коде.

Другие области, чтобы проверить (если это применимо к вашей системе) будет:

  • HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\Speech\Voices\Tokens
  • HKEY_LOCAL_MACHINE\WOW6432Node\SOFTWARE\MICROSOFT\Speech\Voices\Tokens
  • HKEY_CURRENT_USER\WOW6432Node\SOFTWARE\MICROSOFT\Speech\Voices\Tokens
+0

Хорошая мысль. Я проверю это. – Tim

+0

Я взял экспорт частей реестра HKLM \ Software \ Microsoft \ Speech' и 'HKCU \ Software \ Microsoft \ Speech'. 'HKLM' идентичен на проблемной машине и моей локальной машине. 'HKCU' отличается, но я не могу сказать, что что-то повреждено. В 'HKCU' нет' Voices \ Tokens'. Мысли? – Tim

+0

Чтобы прояснить мой комментарий, в «HKLM» (нет в «HKCM») есть три токена голоса, и они являются теми же тремя, что и на других системах (David, Hazel, Zira) со всеми одинаковыми точными значениями (проверено с помощью WinDiff экспорта .reg из двух разных систем). – Tim

Смежные вопросы