2

VB6 ホストから IE9 の新しい JScript 機能 (ネイティブ json など) を使用したいと考えています。私が読んだことから ( http://blogs.msdn.com/b/jscript/archive/2009/04/17/versioning-language-features-in-jscript.aspxを参照)、IActiveScriptProperty を呼び出す必要があります。 :SetProperty を実行し、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"

前の記事の最後のコメントで、Byron は次 のように述べています。

そこで、上記のコードを次のように変更します ( VariantTypeプロパティはhttp://www.xbeat.net/vbspeed/i_OpenODL.htm#VBVM6Libから取得されます):

...
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 としての新機能にアクセスできません。

何か案は?

ありがとう!

4

1 に答える 1

0

宣言をに変更する必要がありSetPropertyます

HRESULT SetProperty(
      [in] LONG    dwProperty,
      [in] void    *pvarIndex,
      [in] VARIANT *pvarValue
   );

インデックスのないプロパティを設定できるようにします。サンプルコードで行ったように、0(NULL)を渡すだけです。現在の宣言はSCRIPTPROP_INVOKEVERSIONING配列として扱われ、最初のインデックスをある値に設定しています。

VT_I2 = VB6の整数、VT_I4 =長いので、これらをハックする必要はありません。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 *を直接渡し、のインターフェースで初期化することができます。IPropertyIActiveScriptclsidJS

于 2013-02-12T08:06:57.597 に答える