各位大虾,俺有个问题,javascript的数组如何传到dll里面,我如何在dll里面处理呀,急
分不够在加,我现在有4000多可用的分。哈哈哈。

解决方案 »

  1.   

    javascipt和vbscript使用的是数组对象,不是SAFEARRAY
      

  2.   

    你的源数组应该是一个_variant_t类型值vVal。
    而且
    vVal.vt == (VT_VARIANT | VT_ARRAY)
    所以
    SAFEARRAY* pSA = vVal.parray;
    从这里面取值就可以了。我也是刚刚学习,不知道对不对?
      

  3.   

    javascript的数据的COM实现是一个自动化COM对象
    即有一个IDispatch接口,
    它有一个属性length,表示数组元素的个数
    还有length个属性,名字分别是0,1,.....length-1下面是一个例子
    为简单化用VB做
    用VB做一个ActiveX Dll,比如工程名TestJScript,类名JScriptArray
    有如下方法
    Public Sub ShowArray(arr As Object)
        '取数组元素的长度
        length = arr.length
        '循环输出第个元素
       For i = 0 To length - 1
            'CallByName一个对象的属性,第二个参数是属性名
            MsgBox "Element " & i & " " & CallByName(arr, CStr(i), VbGet)
        Next
    End Sub编译后,用javascript测试
    写一个.js文件,可以双击直接运行
    var obj = WScript.CreateObject("TestJScript.JScriptArray");var arr = new Array();arr[0] = "Hello from JScript!";
    arr[1] = 1.234;
    arr[2] = new Date();obj.ShowArray(arr);
      

  4.   

    对不起,我说的有点不明白。
    我是用vc开发的atl控件,是用在客户端的不是用在服务器的。
    我在msdn上看了很多但是没有一篇是关于dll在客户端应用的例子。
    请指教
      

  5.   

    我解决了,给分吧。
    STDMETHODIMP CTestArray::Test(VARIANT* Array, BSTR *pVal)
    {
    *pVal = NULL;
    if (Array->vt != (VT_VARIANT | VT_ARRAY | VT_BYREF))
    return E_INVALIDARG; SAFEARRAY* pSa = *Array->pparray;
    LONG Count = pSa->rgsabound[0].cElements;
    _bstr_t Msg = BSTR(NULL);
    VARIANT* pvData = NULL;
    ::SafeArrayAccessData(pSa, (VOID**)&pvData);
    for (LONG i=0; i<Count; i++)
    Msg += _bstr_t(pvData[i]);
    ::SafeArrayUnaccessData(pSa); *pVal = Msg.copy();
    return S_OK;
    }如下使用(VBScript):
    dim a(2)
    a(0) = "Hello"
    a(1) = " World"
    a(2) = "!"
    Dim obj
    set obj = CreateObject("Test.TestArray")
    If not (obj is nothing) Then
    MsgBox obj.test(a)
    End if
      

  6.   

    提几点想法:
    1.即然是DLL,那么在客户端用大概有三种方法,我想得起来的两种是:
       一、newActiveObject 
       二、作为object插入<object></object>
    2.使用方法
       一、前提,如果你的DLL可以改写的,那么最好把接口改得干净点,Assenble的工作放到DLL里面去作,必竟功能强,调试更方便
       二、我以前做的一个项目用的是这种方法:前提,DLL是作为object插到页面里的,<object>id="XXX"</object>,所以我可以利用id真接调用方法传数组参数进去,没发生什么问题。