У меня есть класс (JSObject), который реализует интерфейс IDispatch.Класс работает в JavaScript, запущенном в моем размещенном веб-браузере (IWebBrowser2).
Подробнее о том, как это работает, см. Здесь: Вызов функции C ++ из скрипта JavaScript, запущенного в элементе управления веб-браузера
Я могу позвонить в JSObject из своего кода JavaScript и получить возвращенные целые / длинные числа.Но что-то идет не так, когда функция возвращает строку (BSTR).
Это часть кода IDispatch::Invoke()
:
int lenW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1,
NULL, 0);
BSTR bstrRet = SysAllocStringLen(0, lenW);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, bstrRet,
lenW);
pVarResult->vt = VT_BSTR;
pVarResult->bstrVal = bstrRet;
// Who calls SysFreeString(bstrRet);?
С помощью приведенного выше кода вы можете alert()
возвращенная строка, но вы не можете добавить к ней.alert(returnedString + "foo");
будет отображать только «возвращенную строку».Часть "foo" не добавляется в строку.Кажется, что-то не так с концом строки.Любые идеи кто-нибудь?
Кроме того, я здесь утечка памяти, так как я не звоню SysFreeString()
?
РЕДАКТИРОВАТЬ:
Я временно включенatlbase.h, чтобы я мог использовать CComBSTR
.Приведенный выше код теперь выглядит следующим образом:
pVarResult->vt = VT_BSTR;
pVarResult->bstrVal = CComBSTR("test string");
Переход по этому коду определенно показывает, что pVarResult является «тестовой строкой» до тех пор, пока функция не вернется.Но когда я оповещаю () возвращенную строку в моем коде JavaScript, я «раскрываюсь».alert(returnedString + "foo")
это "расширенный foo".Так что это небольшой шаг в правильном направлении, поскольку вы можете добавить к возвращаемой строке.Но это также шаг в неправильном направлении, поскольку возвращаемая строка - это не то, что я действительно вернул ...
*pVarResult = CComVariant("test string");
Этот код дает те же результаты, что и код в предыдущем листинге (с использованием CComBSTR).