Как использовать функции 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,

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