紧接上一篇文章,本文讨论如何用字符串和数组作为参数。
一 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++里面解析成数组。