我需要填充结构的成员:
typedef struct SPEVENT
{
SPEVENTENUM eEventId : 16;
SPEVENTLPARAMTYPE elParamType : 16;
ULONG ulStreamNum;
ULONGLONG ullAudioStreamOffset;
WPARAM wParam;
LPARAM lParam;
} SPEVENT;
有关如何使用此信息的信息很少。填充它的唯一示例是来自其他用户,但没有官方提供。
接收此事件的应用应获取字符串。用我的方法,它不起作用:字符串是“”。
有人能告诉我他在我的尝试中是否发现任何明显的错误吗?
wstring wsBookmark = L"MyBookmark";
CSpEvent nBookmarkEvent;
nBookmarkEvent.eEventId = SPEI_TTS_BOOKMARK;
nBookmarkEvent.elParamType = SPET_LPARAM_IS_STRING;
nBookmarkEvent.ullAudioStreamOffset = 0;
nBookmarkEvent.lParam = _wtol(wsBookmark.c_str());
nBookmarkEvent.wParam = (LPARAM)wsBookmark.c_str();
正如我所解释的,似乎没有任何有关如何填充这些成员的官方指南。
到目前为止,我发现的是这些用户代码:
CHECKASSERTId(( !wcscmp( (WCHAR*)Event.lParam, szwBMarkStr ) ), tpr, IDS_STRING9);
但是我不知道这是否对我有帮助。
感谢您的任何投入或帮助!
答案 0 :(得分:1)
SPEVENT
结构为documented on MSDN。
在您的情况下,SPET_LPARAM_IS_STRING
标志的文档说:
SPET_LPARAM_IS_STRING
SPEVENT.lParam
值表示指向字符串的指针。 例如,TTS书签事件(即SPEI_TTS_BOOKMARK
)包含一个书签名称的指针,因此lParam
的类型为SPET_LPARAM_IS_STRING
。 用户必须调用CoTaskMemFree
成员上的lParam
(作为指针)以释放关联的内存。
这意味着lParam
指向的内存必须分配给CoTaskMemAlloc()
(或相关功能),而std::wstring
不是,所以您不能只传递{{1} std::wstring::c_str()
中的}指针,则必须复制到CoTask分配的内存块中。
此外,SPEI_TTS_BOOKMARK
说:
SPEI_TTS_BOOKMARK
书签元素用于将书签插入输出流。如果应用程序对书签事件感兴趣,它将在合成期间接收书签事件。lParam
是当前书签名称(以10为基数),已转换为长整数。 如果当前书签的名称不是整数,则wParam
将为零。wParam
是书签字符串。lParam
必须是elParamType
。
因此,您可以尝试以下操作:
SPET_LPARAM_IS_STRING