把JS,vbs中的数组传递给COM组件,Activex

2016-02-19 17:40 46 1 收藏

今天图老师小编要向大家分享个把JS,vbs中的数组传递给COM组件,Activex教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

  COM组件的方法在IDL中的声明:

  [id(1), helpstring("方法InputArray")] HRESULT InputArray([in] VARIANT vData);

  在脚本中建立数组并调用COM组件的方法:

  当数组很大的时候,like 100k ,javascript在给数组赋值的时候效率非常低!完成时间,cpu占用率,占用的内存都大的可怕。反而VBScript却完成的很好。

  COM组件的代码:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  从代码中可以看到vbscript传进来的是个SafeArray。而javascript的情况就复杂了,javascript中得数组并不是真正意义上的数组,这个数组传到COM中被放进一个集合里,参数VARIANT的类型被置为VT_DISPATCH,我们得通过这个IDispatch指针调用invoke才能得到用来读取集合的枚举接口。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

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 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 pEnum( resultV.punkVal );
 if( !pEnum )
 return E_FAIL;
 // Count the elements
 *pdwBytes = 0;
 hr = S_OK;
 
 //Get Enum Size
 while( hr == S_OK )
 {
 hr = pEnum-Skip(1);
 if( hr == S_OK )
  (*pdwBytes)++;
 }
//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;
}

来源:http://www.tulaoshi.com/n/20160219/1615796.html

延伸阅读
标签: Web开发
        今天挺高兴,项目终于上线使用。只是上线之前遇到的问题折磨得人精疲力尽。。。不过总算解决了。。在这把问题说出来,希望对有需要的朋友提供些帮助~~         项目:DOTNET项目,C#开发,主要功能是通过COM组件访问远程接口。   &nbs...
/*程序作者:管宁 站点:www.cndev-lab.com 所有稿件均有版权,如要转载,请务必闻名出处和作者*/ #include stdio.h main() { void search_score(); /* 定义自定义涵数类型为不返回型 */ void count_avg(); /* 定义自定义涵数类型为不返回型 */ static float a[3][4]={{97,45.5,66,77},{88,92.5...
标签: SQLServer
SQL server 的 T-Sql 语言的功能是 非常的强大,但是有个时候 也确实是有些限制和不方便,为什么不象 asp 一样 大量的借用组件呢?开始在 Sql online book 中查找,终于找到了 一个 Sql 的 系统存储过程 sp_OACreate,下面大家就一起去 看看这个 存储过程的神气之处吧 s首先我们先用VB 作一个最简单的组件 ,因为是介绍性的文章,所以这个组件是...
标签: Web开发
数组就是某类数据的集合,数据类型可以是整型、字符串、甚至是对象 Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维数组的功能 1.1 定义数组 声明有10个元素的数组 var a = new Array(10); 此时为a已经开辟了内存空间,包含10个元素,用数组名称加 [下标] ...
标签: ASP
  test.asp[code]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" <html<head <titleactivex组件应用例子一</title</head <% '--------------------------------------------------------- 'activex组件应用例子一 '读取sql server 7 pubs数据库中authors表并分页显示 ...

经验教程

747

收藏

17
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部