IDispatch 유형의 포인터는 배열 객체가 실제로 JavaScript의 내장 배열 객체임을 나타냅니다. JavaScript 측에서는 길이 속성을 통해 배열의 크기를 얻을 수 있습니다. 함수와 Invoke 함수의 길이를 지정하여 배열의 내용을 동적으로 변경할 수 있습니다.
// 배열 길이 가져오기
BSTR bstrLength = L "길이";
DISPID dispid;
hr = lpDispatch->GetIDsOfNames(IID_NULL, &bstrLength, 1,
LOCALE_USER_DEFAULT, &dispid)
if ( SUCCEEDED(hr) ) 🎜>{
CComVariant varResult;
hr = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &noArgs, &varResult,
if( varResult. vt == VT_I4 )
{
nLength = varResult.intVal;
}
}
이때 nLength는 배열의 길이를 가져옵니다.
JavaScript에서 배열은 객체이며, 배열의 내용은 동적으로 생성되는 객체의 속성이며, 이러한 속성의 쿼리 방법은 길이의 쿼리 방법과 다소 유사합니다. GetIDsOfNames 및 Invoke 함수도 차이점은 이름에 있습니다. 즉, 첨자를 통해 얻을 수 있는 속성 이름입니다. 다음과 같이 첨자를 통해서도 얻을 수 있습니다.
for ( int i=0; i{
CComVariant vaIndex(i, VT_I4)
vaIndex.ChangeType(VT_BSTR); >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 );
continue;
}
hr = varResult.ChangeType(VT_BSTR)
CComBSTR bstrVal =
}
따라서 이 두 가지 특성 메서드를 호출하면 모든 JavaScript 배열 개체를 COM 인터페이스에서 쉽게 사용할 수 있습니다.
이것의 이점은 무엇입니까? 많은 온라인 리소스를 살펴보면 대부분 SAFEARRAY를 사용하여 구조를 처리하고 COM 인터페이스로 전달하지만 SAFEARRAY는 MIDL에서 지원되지 않으며 JavaScript는 개체 자체는 이 콘텐츠를 지원하지 않습니다. SAFEARRAY 모드에서 작동하려면 VBScript와 JavaScript 사이를 전환해야 합니다. 이로 인해 유지 관리 담당자가 프로그램을 작성하는 데 어려움을 겪게 됩니다.
JavaScript를 직접 사용하여 배열을 전달하고 어떤 방식으로든 배열을 통합할 필요가 없습니다. SAFEARRAY를 통해 구조를 통합할 필요가 없습니다. 동시에 JavaScript의 모든 객체(요소)에는 고유한 유형 정보가 있으므로 JavaScript의 배열은 C 구조에 대한 최상의 대안(전송 방법)입니다.