Как использовать функции jScript 9 на хосте VB6
Я хочу использовать новые функции JScript в IE9 (нативный json, ...) с хоста VB6. Из того, что я прочитал (см. http://blogs.msdn.com/b/jscript/archive/2009/04/17/versioning-language-features-in-jscript.aspx), я должен вызвать IActiveScriptProperty:: Установите свойство и установите для параметра SCRIPTPROP_INVOKEVERSIONING значение 2 (SCRIPTLANGUAGEVERSION_5_8). Итак, я добавил интерфейс в мой файл odl:
...
[
odl,
uuid(4954E0D0-FBC7-11D1-8410-006008C3FBFC),
]
interface IActiveScriptProperty : stdole.IUnknown
{
HRESULT GetProperty(
[in] LONG dwProperty,
[in] VARIANT *pvarIndex,
[out] VARIANT *pvarValue
);
HRESULT SetProperty(
[in] LONG dwProperty,
[in] VARIANT *pvarIndex,
[in] VARIANT *pvarValue
);
}
...
В хосте VB6 я создаю движок с:
Dim hRes as Long
Dim IUnk as IUnknown
Dim clsidJS as UUID
Dim uuidActScr as UUID
Dim IProperty as IActiveScriptProperty
Dim IScript As IActiveScript
Dim IParse As IActiveScriptParse
' Create the engine
CLSIDFromString "{16d51579-a30b-4c8b-a276-0ff4dc41e755}", clsidJS ' JScript9 (Chakra)
CLSIDFromString IID_IActiveScript, uuidActScr
hRes = CoCreateInstance(clsidJS, Nothing, CLSCTX_INPROC_SERVER, uuidActScr, IUnk)
' Set version
Const SCRIPTPROP_INVOKEVERSIONING As Long = &H4000
Dim Version as Variant
Version = 2
Set IProperty = iUnk
IProperty.SetProperty SCRIPTPROP_INVOKEVERSIONING, 0, Version '<--- Here I get error 5 "Invalid procedure call or argument"
В последнем комментарии к предыдущей статье Байрон говорит: "Недокументированная" особенность "SetProperty с SCRIPTPTOP_INVOKEVERSIONING заключается в том, что значение должно быть VT_I4 или VT_I2 - любой другой целочисленный тип будет отклонен как недействительный".
Поэтому я изменяю приведенный выше код на (свойство VariantType взято с http://www.xbeat.net/vbspeed/i_OpenODL.htm):
...
Version = 2
VariantType(Version) = VT_I4 ' Force VT_I4 variant type
Set IProperty = iUnk
IProperty.SetProperty SCRIPTPROP_INVOKEVERSIONING, 0, Version '<--- Here I get the same error 5 "Invalid procedure call or argument"
ПРИМЕЧАНИЕ. Если я не пытаюсь установить свойство SCRIPTPROP_INVOKEVERSIONING, движок работает нормально, и если я запускаю: ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion() + "." + ScriptEngineBuildVersion() Я получаю "9.0.16457", но у меня нет доступа к новым функциям, как родной JSON.
Есть идеи?
Спасибо!
1 ответ
Вы должны изменить декларацию от SetProperty
в
HRESULT SetProperty(
[in] LONG dwProperty,
[in] void *pvarIndex,
[in] VARIANT *pvarValue
);
чтобы иметь возможность устанавливать свойства без индекса. Просто передайте 0 (NULL), как вы сделали в своем примере кода. Настоящая декларация относится SCRIPTPROP_INVOKEVERSIONING
как массив, и вы устанавливаете первый индекс на какое-то значение.
Имейте в виду, что VT_I2 = Integer в VB6 и VT_I4 = Long, поэтому не нужно их взламывать. Просто используйте 2 или 2 и или Private Const SCRIPTLANGUAGEVERSION_5_8 As Long = 2
и const будет правильно набран.
Также обратите внимание, что на этой линии hRes = CoCreateInstance(clsidJS, Nothing, CLSCTX_INPROC_SERVER, uuidActScr, IUnk)
вы уже получаете IActiveScript
интерфейс. Не нужно позже бросить Set IProperty = iUnk
,
Все зависит от того, как вы заявляете CoCreateInstance
-- с помощью void *
для последнего параметра позволит вам напрямую пройти IProperty
переменная и получить его инициализировать с IActiveScript
интерфейс clsidJS
,