gpt4 book ai didi

c++ - wstring 到 LPARAM 和 WPARAM

转载 作者:行者123 更新时间:2023-11-28 04:20:26 24 4
gpt4 key购买 nike

我需要填充结构的成员:

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();

正如我所解释的,似乎没有关于如何填充这些成员的任何官方指南。

到目前为止我发现的是这些用户代码:

https://github.com/m-toman/SALB/blob/master/sapi/htstts.cpp在这个链接中我看到了这个:

CHECKASSERTId(( !wcscmp( (WCHAR*)Event.lParam, szwBMarkStr ) ), tpr, IDS_STRING9); 

但我不知道这是否对我有帮助。

感谢您的任何输入或帮助!

最佳答案

SPEVENT 结构是 documented on MSDN .

在您的情况下,SPET_LPARAM_IS_STRING 的文档旗帜说:

SPET_LPARAM_IS_STRING
The SPEVENT.lParam value represents a pointer to a string. For example, the TTS bookmark event (i.e., SPEI_TTS_BOOKMARK) includes a pointer the bookmark name, so the lParam type is SPET_LPARAM_IS_STRING. The user must call CoTaskMemFree on the lParam member (as pointer) to release the associated memory.

这意味着 lParam 指向的内存必须通过 CoTaskMemAlloc()(或相关函数)分配,其中 std::wstring 不是,所以你不能只传递 lParam 中的 std::wstring::c_str() 指针,你必须复制到 CoTask 分配的内存块.

另外,SPEI_TTS_BOOKMARK说:

SPEI_TTS_BOOKMARK
The bookmark element is used to insert a bookmark into the output stream. If an application specifies interest in bookmark events, it will receive the bookmark events during synthesis. wParam is the current bookmark name (in base 10) converted to a long integer. If name of current bookmark is not an integer, wParam will be zero. lParam is the bookmark string. elParamType has to be SPET_LPARAM_IS_STRING.

所以,话虽如此,试试这个:

wstring wsBookmark = L"MyBookmark";

UINT size = (wsBookmark.size() + 1) * sizeof(wchar_t);

wchar_t *ptr = (wchar_t*) CoTaskMemAlloc(size);
CopyMemory(ptr, wsBookmark.c_str(), size);

CSpEvent nBookmarkEvent;
nBookmarkEvent.eEventId = SPEI_TTS_BOOKMARK;
nBookmarkEvent.elParamType = SPET_LPARAM_IS_STRING;
nBookmarkEvent.ullAudioStreamOffset = 0;
nBookmarkEvent.wParam = 0;
nBookmarkEvent.lParam = (LPARAM) ptr;

关于c++ - wstring 到 LPARAM 和 WPARAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55564863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com