wstring到LPARAM和WPARAM

时间:2019-04-08 00:24:51

标签: c++ winapi

我需要填充结构的成员:

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

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

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

enter image description here 在此链接中,我看到以下内容:

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

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

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

1 个答案:

答案 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