wstring для LPARAM и WPARAM - PullRequest
       3

wstring для LPARAM и WPARAM

0 голосов
/ 08 апреля 2019

Мне нужно заполнить членов структуры:

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

Но я понятия не имею, поможет ли это мне.

Спасибо за любой вклад или помощь !!

1 Ответ

1 голос
/ 08 апреля 2019

Структура SPEVENT задокументирована в 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 нет, поэтому вы не можете просто передать указатель std::wstring::c_str() в lParam, Вы должны сделать копию в блок памяти, выделенный CoTask.

Также, SPEI_TTS_BOOKMARK говорит:

SPEI_TTS_BOOKMARK
Элемент закладки используется для вставки закладки в выходной поток. Если приложение указывает интерес к событиям закладки, оно получит события закладки во время синтеза. wParam - имя текущей закладки (в базе 10), преобразованное в длинное целое число. Если имя текущей закладки не является целым числом, wParam будет равно нулю. lParam - строка закладки. elParamType должно быть 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...