-
问题内容:求助!JS数组传入com组件后如何获取?(找了好久还是没找到答案!)
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5179843
- 所属论坛:ATL/ActiveX/COM
审核组:VC/MFC
- 提问者:hqulyc
解决者:superarhow
- 感谢:wylcy
- 关键字:VC/MFC 调用 元素 变量 ATL/ActiveX/COM 组件 array 进来 获取 传入 申明 索引
- 答案:
求助!JS数组传入com组件后如何获取?
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;
int nLen = 5;
VARTYPE vt = varArray.vt;
if( vt == VT_DISPATCH )
{
//deal with javascript array
VariantToBSTR(varArray ->pdispVal,nLen);
}
else
{
//deal with vbscript array
}
return S_OK;
}
解决如下:
HRESULT CXXXXX::VariantToBSTR(IDispatch* disp, int nLen)
{
// DebugBreak();
UINT nSize = 0;
HRESULT hr = disp ->GetTypeInfo(GetTypeInfoCount(&nSize);
DISPPARAMS noArgs = { NULL, NULL, 0, 0 };
for( int i=0; i<nLen; 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;
}
return S_OK;
}
- 评价:
给朵鲜花(2)
扔个鸡蛋(1)