改问题,我研究了一天还没搞到烦死了,还希望知道的人能告诉我一下。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太麻烦了,头晕死了,希望能快点解决,请高手帮忙看看!
{
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太麻烦了,头晕死了,希望能快点解决,请高手帮忙看看!
error C2065: 'CComSafeArray' : undeclared identifier
要#include "atlsafe.h"
C2275: 'VARIANT' : illegal use of this type as an expression
要#include "afxdisp.h"???lz别这急,兔子党马上就来了.
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下为什么这样不行,运行时会出错
<para name="id" value="val">
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");