Ошибка добавления символа SCRIPTITEM_CODEONLY с использованием механизма IE9 JS (чакра)

Некоторое время мы использовали активные сценарии в нашем расширении браузера (BHO) со старым механизмом JScript (CLSID_JScript), и недавно мы решили также поддержать новый механизм сценариев IE9 (Chakra). Одна вещь, которую мы делаем, это добавляем символы в движок, используя AddNamedItem с SCRIPTITEM_CODEONLY возможность создавать собственные модули (пространства имен). К сожалению, мы не смогли заставить это работать с чакрой. Даже самый тривиальный пример, где мы добавляем символ и немедленно получаем его отправку скрипта, дает E_OUTOFMEMORY ошибка.

if (SUCCEEDED(hr)) {
  hr = scriptEngine->AddNamedItem(L"test", SCRIPTITEM_CODEONLY);
}
if (SUCCEEDED(hr)) {
   hr = scriptEngine->GetScriptDispatch(L"test", &scriptDispatch);
}

GetScriptDispatch вызов возвращает ошибку. Вы можете увидеть весь пример на Github.

Я устанавливаю точки останова на всех IActiveScriptSite методы и единственные, которые называются GetLCID а также OnStateChangeтак что не думайте, что реализация сайта - это проблема.

Я рассмотрел каждый пример, который смог найти, и попробовал все, о чем только мог подумать, включая настройку состояния двигателя на SCRIPTSTATE_CONNECTED вручную, реализуя любые дополнительные интерфейсы, для которых он QI и т. д. Я даже попытался вернуть действительный LCID, Ничто, кажется, не имеет значения.

Любая идея, что дает? Я предполагаю, что этот базовый пример должен работать в чакре.

1 ответ

Решение

К сожалению, реальность такова, что набор интерфейсов IActiveScript, представленный Chakra, не предназначен для публичного использования. (GUID не публикуется в реестре именно по этой причине.) Chakra реализует только ту часть интерфейсов IActiveScript, которая необходима для поддержки Internet Explorer и редактора / отладчика Visual Studio, и не было предпринято никаких усилий для обеспечения полноты или правильности из интерфейсов, помимо тех, которые используют эти два клиента.

Похоже, что ваш сценарий - один из тех, которые не реализованы в спецификации, возможно, потому что IE/VS не использует интерфейс именно таким образом. К сожалению, почти нет шансов, что это будет исправлено, если не будет принято решение о публичной поддержке интерфейсов IActiveScript в какой-то будущей версии IE.

IE11 представил публичный API для Chakra, но он не основан на IActiveScript, а основан на Win32. Вы можете получить более подробную информацию здесь: http://www.panopticoncentral.net/2013/07/02/introducing-jsrt-embedding-javascript-on-windows/. Я понятия не имею, поможет ли это вам в вашей ситуации или нет.

Извините, не тот ответ, на который вы надеялись, я уверен...

Другие вопросы по тегам