#define
SPCAT_VOICES
L
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices"
#define
SPKEY_ATTRIBUTES
L
"Attributes"
#define
SPVALUE_LANGUAGE
L
"Language"
BOOL
CActionCenter
::
InitializeSAPI
()
{
ReleaseSAPI
();
HRESULT
hr
;
hr
=
m_cpVoice
.
CoCreateInstance
(
CLSID_SpVoice
);
if
(
hr
==
S_OK
)
{
ISpObjectToken
*
pToken
;
// NOTE: Not a CComPtr! Be Careful.
CComPtr
<
IEnumSpObjectTokens
>
cpEnum
;
hr
=
SpEnumTokens
(
SPCAT_VOICES
,
L
""
,
L
""
, &
cpEnum
);
if
(
hr
==
S_OK
)
{
bool
fSetDefault
=
false
;
while
(
cpEnum
->
Next
(1, &
pToken
,
NULL
) ==
S_OK
)
{
//CSpDynamicString dstrDesc;
//hr = SpGetDescription(pToken, &dstrDesc);
//if (SUCCEEDED(hr))
{
m_vecISpToken
.
push_back
(
pToken
);
}
}
return
(
m_vecISpToken
.
size
() > 0);
}
}
return
FALSE
;
}
void
CActionCenter
::
ReleaseSAPI
()
{
vector
<
ISpObjectToken
*>::
iterator
it
;
for
(
it
=
m_vecISpToken
.
begin
();
it
!=
m_vecISpToken
.
end
(); ++
it
)
{
(*
it
)->
Release
();
}
m_vecISpToken
.
clear
();
}
void
CActionCenter
::
SetVoice
(
LANGID
lid
)
{
vector
<
ISpObjectToken
*>::
iterator
it
;
WCHAR
wstrLangID
[32] = {0};
swprintf
(
wstrLangID
,
L
"%X"
,
lid
);
for
(
it
=
m_vecISpToken
.
begin
();
it
!=
m_vecISpToken
.
end
(); ++
it
)
{
ISpObjectToken
*
pToken
= (*
it
);
ISpDataKey
*
pSpDataKeyAttributes
=
NULL
;
HRESULT
hr
=
pToken
->
OpenKey
(
SPKEY_ATTRIBUTES
, &
pSpDataKeyAttributes
);
if
(
SUCCEEDED
(
hr
))
{
WCHAR
*
wstrLanguageID
=
NULL
;
hr
=
pSpDataKeyAttributes
->
GetStringValue
(
SPVALUE_LANGUAGE
, (
WCHAR
**)&
wstrLanguageID
);
if
(
SUCCEEDED
(
hr
))
{
if
(
wcsstr
((
BSTR
)
wstrLanguageID
, (
BSTR
)
wstrLangID
))
{
m_cpVoice
->
SetVoice
(
pToken
);
break
;
}
}
pSpDataKeyAttributes
->
Release
();
}
}
}