JS代码:
var arArray = new Array("1","sadf","2","asdff","test");
if( document.stepDemo) document.stepDemo.putVariant(arArray);接口定义:
STDMETHODIMP CXXXXXX::putVariant(VARIANT varArray)
{
HRESULT hr = S_OK;
DWORD nLen = 5;
VARTYPE vt = varArray.vt;
if( vt == VT_DISPATCH )
{
//deal with javascript array
}
else
{
//deal with vbscript array
}
return S_OK;
}JS传入进来的VARIANT是个VT_DISPATCH类型变量,不知道如何获取到我传进来的字符串数组??
如何获取呢???
var arArray = new Array("1","sadf","2","asdff","test");
if( document.stepDemo) document.stepDemo.putVariant(arArray);接口定义:
STDMETHODIMP CXXXXXX::putVariant(VARIANT varArray)
{
HRESULT hr = S_OK;
DWORD nLen = 5;
VARTYPE vt = varArray.vt;
if( vt == VT_DISPATCH )
{
//deal with javascript array
}
else
{
//deal with vbscript array
}
return S_OK;
}JS传入进来的VARIANT是个VT_DISPATCH类型变量,不知道如何获取到我传进来的字符串数组??
如何获取呢???
比如访问索引0的元素,就先GetIDOfNames( .... L"0", ... ),再用拿到的id调用Invoke,调用的时候用PROPERTY_GET或PROPERTY_SET都可以。
[helpstring("some method")] HRESULT SomeMethod([in] SAFEARRAY(ItemType)* parameter);
看了你的方法我如下实现还是没办法得到还数据,不知道是不是我的操作有问题:
/*-------------------------------------------*/
UINT nSize = 0;
HRESULT hr = disp ->GetTypeInfoCount(&nSize);
DISPPARAMS noArgs = { NULL, NULL, 0, 0 };
for( int i=0; i<5; i++ )
{
CComVariant varIndex(i,VT_I4);
varIndex.ChangeType(VT_BSTR);
DISPID dispId;
hr = disp ->GetIDsOfNames(IID_NULL,&varIndex.bstrVal,1,LOCALE_USER_DEFAULT,&dispId);
if( FAILED(hr) ) continue;
CComVariant varResult;
hr = disp->Invoke( dispId,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET,
&noArgs,
&varResult,
NULL,
NULL );
VARTYPE vt = varResult.vt;
hr = varResult.ChangeType( VT_BSTR );
CComBSTR bstrVal = varResult.bstrVal;
}
/*---------------------------*/
尝试了用SAFEARRAY来定义,似乎接口不支持,我如下定义,编译没通过[helpstring("some method")] HRESULT SomeMethod([in] SAFEARRAY(BSTR)* parameter);
值可以正确得到了,thanks,刚没以为取到的值错了!