首先,CComPtr 是对 COM 接口的智能指针抽象,而不是枚举器。
要列出所有声音,您需要枚举SPCAT_VOICES类别中的标记。
HRESULT hr = S_OK;
CComPtr<ISpObjectTokenCategory> cpSpCategory = NULL;
if (SUCCEEDED(hr = SpGetCategoryFromId(SPCAT_VOICES, &cpSpCategory)))
{
CComPtr<IEnumSpObjectTokens> cpSpEnumTokens;
if (SUCCEEDED(hr = cpSpCategory->EnumTokens(NULL, NULL, &cpSpEnumTokens)))
{
CComPtr<ISpObjectToken> pSpTok;
while (SUCCEEDED(hr = cpSpEnumTokens->Next(1,&pSpTok, NULL))))
{
// do something with the token here; for example, set the voice
pVoice->SetVoice(pSpTok,FALSE);
// NOTE: IEnumSpObjectTokens::Next will *overwrite* the pointer; must manually release
pSpTok.Release();
}
}
}
如果你想选择一个特定的声音,你需要指定一个对该声音唯一的属性。 EnumTokens允许您指定必需的和可选的属性。属性实际上是由声音的创建者定义的,但一些常见的属性是
- 姓名(例如,“Microsoft Anna”)
- 语言(由数字语言环境 ID 指定)
- 性别(男/女)
- 供应商(创建声音的公司名称)
因此,要指定“Microsoft Anna”而不是任何声音,您可以使用
if (SUCCEEDED(hr = cpSpCategory->EnumTokens(L"Name=Microsoft Anna", NULL, &cpSpEnumTokens)))
代替
if (SUCCEEDED(hr = cpSpCategory->EnumTokens(NULL, NULL, &cpSpEnumTokens)))