js调用c/c++dll,用字符串/数组作为参数

来源:互联网 发布:艾瑞咨询 网络购物 编辑:程序博客网 时间:2024/05/20 11:22

紧接上一篇文章,本文讨论如何用字符串和数组作为参数。

一 js传递字符串 dll返回字符串

这里dll的方法里面参数类型用char*是不行的,需要用BSTR这种类型。我们演示一下js传递字符串"hello"给dll,然后dll将字符串返回。

1 首先在项目里面点击 视图--类视图,找到类接口,点击右键添加--方法

请参考上一篇文章看一下这个项目如何创建出来的。

 

填写方法名和参数,结果如下

点击完成。

打开类文件,编辑方法getHe如下

 

 

 

然后编译项目,将Test.dll注册,在页面调用即可。具体步骤请参考上一篇文章

 

 

二 dll返回数组

js接受数组需要借助于vbscript,首先返回参数类型也要用VARIANT*类型,我们直接贴源码

以下是c++方法源码

 

STDMETHODIMP CDYL::returnArray(VARIANT* ra)
{
 SAFEARRAY FAR* psa;
  //数组维数
  SAFEARRAYBOUND rgsabound[1];

  rgsabound[0].lLbound = 0;
  rgsabound[0].cElements = 2;
  psa=SafeArrayCreate(VT_VARIANT,1,rgsabound);//我这里原来没用VT_VARIANT,而是用了VT_I4类型,结果会导致JS代码中new VBArray出错,请一定注意

  long idx;
  VARIANT setdt;
  setdt.vt = VT_R8;

  //赋值
  idx = 0;
  setdt.dblVal = 3.1415926;
  SafeArrayPutElement(psa,&idx,&setdt);
  idx = 1;
  setdt.dblVal = 5.214 ;
  SafeArrayPutElement(psa,&idx,&setdt);

  //返回安全数组
  V_VT(ra) = VT_ARRAY | VT_VARIANT;//我这里原来没用VT_VARIANT,而是用了VT_I4类型,结果会导致JS代码中new VBArray出错,请一定注意
  V_ARRAY(ra) = psa;
    return S_OK;
}

 

 

以下是js调用的代码:

<script>
  var mydll=new ActiveXObject("dyl");
  var result=new VBArray(mydll.returnArray()).toArray();
  alert(result);
  </script>

以上方法能实现dll返回的参数js接收到,不过局限就是在ie下,要借助vb,所以,有传递数组的需求的话,建议使用字符串传递,然后分别在js或者c/c++里面解析成数组。

0 0