JavaScript が COM を呼び出して配列を渡すと、COM インターフェイスは配列などの VARIANT 型オブジェクトを受け取ります。このオブジェクトの vt 型は VT_DISPATCH であるため、その値は IDispatch 型ポインターを表します。
IDispatch 型のポインターは、配列オブジェクトが実際には JavaScript の組み込み配列オブジェクトであることを示します。JavaScript 側では、GetIDsOfNames を通じて配列のサイズを取得できます。関数と Invoke 関数の長さにより、配列の内容を動的に可変にすることができます。
引用した内容は以下の通りです。 //配列の長さを取得します } |
このとき、nLength は配列の長さを取得します。
JavaScript の配列はオブジェクトであり、配列の内容は動的に作成されるオブジェクトの属性であり、これらの属性のクエリ メソッドは、GetIDsOfNames および Invoke 関数と似ています。主な違いは名前の違いです。配列内の要素オブジェクトの属性の名前は動的に作成されます。つまり、属性名は添え字によって取得できます。以下に続きます:
引用した内容は以下の通りです。 for ( int i = 0 ; i < nLength; ++ i) |
したがって、これら 2 つの属性メソッドを呼び出すことにより、すべての JavaScript 配列オブジェクトを COM インターフェイスで使用できるようになります。
これにはどのような利点がありますか? 多くのオンライン リソースを見ると、そのほとんどが SAFEARRAY を使用して構造体を処理し、それを COM インターフェイスに渡していることがわかりました。ただし、SAFEARRAY は MIDL ではサポートされておらず、JavaScript オブジェクト自体もサポートされていません。このコンテンツを SAFEARRAY モードで動作させるには、VBScript と JavaScript を切り替える必要があり、プログラムの作成が難しくなり、保守担当者が混乱する可能性があります。
JavaScript を直接使用して配列を渡し、何らかの方法で配列を統合します。SAFEARRAY メソッドを通じて構造を統合する必要はありません。同時に、JavaScript のすべてのオブジェクト (要素) は独自の型情報を持っているため、JavaScript の配列は C の構造体の最良の代替 (転送メソッド) となります。