改问题,我研究了一天还没搞到烦死了,还希望知道的人能告诉我一下。typedef struct _DATA
{
int     id;             
int     sex;             
         char[16] name;

}DATA, *PDATA;使用事件传递参数:
void Test2(VARIANT data);
我需要将_DATA传递给javascript我不知道怎么把_DATA结构转为VARIANT型,论坛内的相关代码我也看过如:
VARIANT CMyHtmlDlgDlg::GetStringList() 

   VARIANT varStrList; 
   ::VariantInit(&varStrList); 
   CComSafeArray<BSTR> m_oArrSrInfo; 
   BSTR bstr1, bstr2; 
   bstr1 = SysAllocString(L"hello"); 
   bstr2 = SysAllocString(L"world"); 
   m_oArrSrInfo.Add(bstr1); 
   m_oArrSrInfo.Add(bstr2); 
   V_VT(&varStrList) = VT_VARIANT | VT_ARRAY; 
    V_ARRAY(&varStrList) = m_oArrSrInfo; 
   SysFreeString(bstr1); 
   SysFreeString(bstr2); 
   return varStrList.Detach(); 
}JScript codefunction GetMsgList()

    var msgList = new VBArray(window.external.GetStringList()).toArray(); 
 }在我这就编译不过error C2065: 'CComSafeArray' : undeclared identifier
C2275: 'VARIANT' : illegal use of this type as an expression等错误,OCX太麻烦了,头晕死了,希望能快点解决,请高手帮忙看看!

解决方案 »

  1.   


    error C2065: 'CComSafeArray' : undeclared identifier
    要#include "atlsafe.h"
    C2275: 'VARIANT' : illegal use of this type as an expression
    要#include "afxdisp.h"???lz别这急,兔子党马上就来了.
      

  2.   

    SAFEARRAY * pLSA = NULL;
    Line *pLineData=NULL;
    VARIANT LineVal; SAFEARRAYBOUND dimension[1];
    dimension[0].lLbound =0;

    dimension[0].cElements = 1;
    pLSA = SafeArrayCreate(VT_BSTR,1,dimension); SafeArrayAccessData(pLSA,(void  HUGEP* FAR *)  &pLineData);
    for (int i=0;i<1;i++)
    {
    pLineData[i].id = 10;
    pLineData[i].Power = 2;
    pLineData[i].LineName = L"Hello";
    pLineData[i].StaPoint_x = 3;
    pLineData[i].StaPoint_y = 4;
    pLineData[i].EndPoint_x = 5;
    pLineData[i].EndPoint_y = 6;
    pLineData[i].EndType =7;
    pLineData[i].Longth  = 8;
    pLineData[i].ShCirFlag = 1;
    } SafeArrayUnaccessData(pLSA); LineVal.vt = VT_ARRAY;
    LineVal.parray = pLSA;

    Test2(LineVal);
    在OCX下为什么这样不行,运行时会出错
      

  3.   

    这个~
    <para name="id" value="val"> 
      

  4.   

    兄弟,不用浪费时间了,你想想就明白,这是不可能的。
    JAVASCRIPT只认variant,而结构体本质上是一个内存块,非要传的话,只能把结构体当数组玩。对于JS,数组类型统统是CComSafeArray<VARIANT>,而SAFEARRAY内存不是连续的,处理极其麻烦。
    所以问题是你为啥要传结构体呢?解决方案:
    A。将
    typedef struct _DATA
    {
    int id;   
    int sex;   
      char[16] name;}DATA, *PDATA;
    删掉,换成一个COM对象而且是带IDISPATCH接口的,id,sex,name统统是这个对象的属性。其中name为BSTR类型。
    然后JS代码可以这样写。
    var obj=new ActiveXObject("DATA的progid");
    obj.id=10;
    ....
    comObj.Test(obj);B。当然不用结构体了,将其三个成员,变成三个参数,传给COM对象
    comObj.Test(10,0,"123");