把javascript,vbscript中得数组传递给COM组件(or Act
来源:互联网 发布:java获取当月的第一天 编辑:程序博客网 时间:2024/05/16 08:26
COM组件的方法在IDL中的声明:[id(1), helpstring("方法InputArray")] HRESULT InputArray([in] VARIANT vData);
在脚本中建立数组并调用COM组件的方法:当数组很大的时候,like 100k ,javascript在给数组赋值的时候效率非常低!完成时间,cpu占用率,占用的内存都大的可怕。反而COM" target=_blank>vbscript却完成的很好。
COM组件的代码:从代码中可以看到COM" target=_blank>vbscript传进来的是个SafeArray。而javascript的情况就复杂了,javascript中得数组并不是真正意义上的数组,这个“数组”传到COM中被放进一个集合里,参数VARIANT的类型被置为VT_DISPATCH,我们得通过这个IDispatch指针调用invoke才能得到用来读取集合的枚举接口。STDMETHODIMP CBigParamCtl::InputArray(VARIANT vData){ LPBYTE p ; DWorD nLen;
HRESULT hr;
if( vData.vt == VT_DISPATCH) { //deal with javascript array hr = VariantEnumToBytes(vData.pdispVal,&p, &nLen); } else { //deal with COM" target=_blank>vbscript array hr = VariantArrayToBytes(&vData, &p, &nLen) ; }
if( S_OK == hr) { //....... do sth on p delete[] p; } return S_OK;}
HRESULT VariantEnumToBytes(IDispatch* disp, LPBYTE *ppBytes, DWorD *pdwBytes){ // DebugBreak(); HRESULT hr; DISPPARAMS noArgs = { NULL, NULL, 0, 0 }; CCOMVariant resultV; hr = disp->Invoke( DISPID_NEWENUM, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &noArgs, &resultV, NULL, NULL ); if( FAILED( hr ) && FAILED( resultV.ChangeType( VT_UNKNOWN ) ) ) return E_FAIL; // Bug 37459, above Invoke succeeds, but returns resultV.vt == VT_EMPTY, resultV->other param unchanged if (resultV.vt != VT_UNKNOWN && resultV.vt != VT_DISPATCH) { return E_FAIL; } CCOMQIPtr
//allocate memory *ppBytes = (LPBYTE)new BYTE[*pdwBytes];
int nCount = 0; CCOMVariant elemV; pEnum->Reset(); hr = S_OK; while( hr == S_OK ) { // Could switch to use Skip when Cary gets // it working. hr = pEnum->Next( 1, &elemV, NULL ); if( elemV.vt != VT_I4 ) hr = S_FALSE; // correct for dispproxy bug 19307 else { int nTmp = elemV.lVal; (*ppBytes)[nCount] = (BYTE)nTmp; } if( hr == S_OK ) nCount++; } return S_OK;}
HRESULT VariantArrayToBytes(VARIANT *pVariant, LPBYTE *ppBytes, DWorD *pdwBytes){ USES_CONVERSION; if (pVariant->vt != (VT_VARIANT | VT_BYREF)) return E_INVALIDARG;
if (!(pVariant->pvarVal->vt & VT_ARRAY)) return E_INVALIDARG;
SAFEARRAY* pX = NULL;
if (pVariant->pvarVal->vt & VT_BYREF) pX = *(pVariant->pvarVal->pparray); else pX = pVariant->pvarVal->parray;
if (::SafeArrayGetDim(pX) != 1) return E_INVALIDARG;
*ppBytes = NULL; *pdwBytes = 0;
VARIANT *pArray = NULL; HRESULT hr = E_FAIL;
_variant_t v; hr = SafeArrayAccessData(pX, (void **) &pArray ); if( SUCCEEDED(hr)) { *pdwBytes = pX->rgsabound->cElements; *ppBytes = (LPBYTE)new BYTE[*pdwBytes];
for( DWorD i = 0; i < *pdwBytes; i++) { v = pArray[i]; v.ChangeType(VT_UI1); (*ppBytes)[i] = v.bVal; }
SafeArrayUnaccessData( pX ); } else return hr;
SafeArrayDestroy(pX);
return S_OK;}
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>- 把javascript,vbscript中得数组传递给COM组件(or Act
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- 把数组传递给函数
- COM组件,字符串数组的传递
- vbscript与javascript传递变量
- 怎样把数组作为参数传递给函数
- Android JNI 把Java数组传递给C
- COM组件开发笔记--字符串数组的传递
- COM组件开发笔记--字符串数组的传递
- COM组件开发笔记--字符串数组的传递
- COM/DCOM中如何传递数组:
- COM/DCOM中如何传递数组
- jni中c++给java传递数组
- 在COM组件中调用JavaScript函数
- 在COM组件中调用JavaScript函数
- Groovy探索之invokeMethod方法
- 如何修复状态
- 浮点数取小数点后几位并对小数四舍五入
- ubuntu8.04硬盘安装 转
- 关于flashback versions query 和flashback transaction query 特性
- 把javascript,vbscript中得数组传递给COM组件(or Act
- 跨平台C++程序开发经验小结
- SavePoint(bzszp)
- 同一个类,映射多个窗口
- Microsoft数据引擎MSDE
- 实现和IE浏览器交互的几种方法的介绍
- /var/spool/clientmqueue/目录下的产生大量文件的解决办法
- 基本性能调整2
- 流Mini驱动开发指南(二)