为什么只有当进程作为服务运行时,Speak()后面的代码才会失败,错误代码为0x80045063(SPERR_NOT_ACTIVE_SESSION)?
ISpVoicePtr pVoice;
CoCreateInstance(
CLSID_SpVoice,
0,
CLSCTX_INPROC_SERVER,
IID_ISpVoice, ( LPVOID * ) &pVoice
);
pVoice->SetOutput( 0, TRUE );
pVoice->Speak( L"Hello", 0, NULL );
我能提出的唯一资源是关于与桌面会话交互的服务的安全性更改。 .NET中的以下内容将在一个服务中运行,所以我只是想知道如何使用带或不带SAPI的普通C ++来实现它。
System::Speech::Synthesis::SpeechSynthesizer synth;
synth.SetOutputToDefaultAudioDevice();
synth.Speak( "Hello" );
答案 0 :(得分:2)
SAPI文档将SPERR_NOT_ACTIVE_SESSION
列为
非活动控制台会话不支持音频输出和输入。
服务在后台会话中运行。由于Vista中引入了Session 0 Isolation,服务无法访问包含文字转语音在内的交互式资源。
在谷歌上搜索,我发现了一些评论来支持这一主张:
http://www.ip-symcon.de/en/service/documentation/module-reference/text-to-speech/tts-speak/
此功能在Windows __ Vista / 2003__或更新版本下无效。 这是因为出于安全原因,IP-Symcon等服务无法访问系统中的交互式组件。 Text To Speech输出是一个交互式组件。该问题表现为错误消息:__ OLE错误80045063__提取MSDN: SPERR_NOT_ACTIVE_SESSION 。
请注意,它们(故意我认为)从Vista(及更高版本)开始破坏了这些东西。 如果您尝试在服务中使用SAPI的ISpMMSysAudio界面(因为它们在上面的链接中的项目符号中进行了草绘),迟早会看到SPERR_NOT_ACTIVE_SESSION错误。 < / p>
对于SpeechSynthesizer
,我的猜测是它内部不使用SAPI。 SpeechSynthesizer
的源代码可在此处获取: