IDispatch 型のポインターは、配列オブジェクトが実際には JavaScript の組み込み配列オブジェクトであることを示します。JavaScript 側では、GetIDsOfNames を通じて配列のサイズを取得できます。関数と Invoke 関数の長さにより、配列の内容を動的に可変にすることができます。
// 配列の長さを取得します
BSTR bstrLength = L "長さ";
DISPID dispid;
hr = lpDispatch->GetIDsOfNames(IID_NULL, &bstrLength, 1,
LOCALE_USER_DEFAULT, &dispid); 🎜>{
CComVariant varResult;
hr = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &noArgs, &varResult, NULL, NULL); vt == VT_I4 )
{
nLength = varResult.intVal;
}
}
このとき、nLength は配列の長さを取得します。
JavaScript の配列はオブジェクトであり、配列の内容は動的に作成されるオブジェクトの属性であり、これらの属性のクエリ メソッドは長さのクエリ メソッドに似ています。 GetIDsOfNames 関数と Invoke 関数も同様です。主な関数は名前です。配列内の要素オブジェクトの属性の名前は動的に作成されます。つまり、ここでは属性名を取得します。次のように添え字を付けて取得することもできます:
コードをコピー
CComVariant vaIndex(i, VT_I4);
DISPID dispid; >hr = lpDispatch->GetIDsOfNames(IID_NULL, &vaIndex.bstrVal ,1,
LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr) )
{
続行; >CComVariant varResult;
hr = lpDispatch->Invoke (dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &noArgs, &varResult, NULL, NULL);
VARTYPE vt = varResult.vt; vt == VT_DISPATCH )
{
InvokeArray( varResult );
}
hr = varResult.ChangeType(VT_BSTR)
CComBSTR = varResult.bstrVal; >}
したがって、これら 2 つの属性メソッドを呼び出すことにより、すべての JavaScript 配列オブジェクトを COM インターフェイスで容易に実行できます。
これにはどのような利点がありますか? 多くのオンライン リソースを見ると、そのほとんどが SAFEARRAY を使用して構造体を処理し、COM インターフェイスに渡していることがわかりましたが、SAFEARRAY は MIDL と JavaScript ではサポートされていません。オブジェクト自体はこのコンテンツをサポートしていません。SAFEARRAY モードで動作するには、VBScript と JavaScript を切り替える必要があります。これにより、プログラムの作成が困難になり、保守担当者が混乱する可能性があります。
JavaScript を直接使用して配列を渡し、SAFEARRAY を通じて構造を統合する必要はありません。同時に、JavaScript のすべてのオブジェクト (要素) は独自の型情報を持っているため、JavaScript の配列は C の構造体の最良の代替 (転送メソッド) となります。