一个ATL COM组件返回一个结构数组,在页面中用javascript调用COM组件,并获得数组中每个结构中对象的值,该怎么做呢?

dannylee322 2009-06-15 04:34:28
一个ATL COM组件返回一个结构数组,在页面中用javascript调用COM组件,并获得数组中每个结构中对象的值,该怎么做呢?

一个ATL COM组件,组件返回一个自定义结构数组,在h文件中定义如下:
typedef struct _MYCERT_CONTEXT {
DWORD ver;
BSTR name; //或者是CComBSTR name;
} MYCERT_CONTEXT, *PMYCERT_CONTEXT;
实现如下:
STDMETHODIMP CmyCerts::getArray(VARIANT* pvar){
//m_sa在.h文件中定义 CComSafeArray<VARIANT> m_sa;
pCertInfo[0]->ver = 1;
pCertInfo[0]->name = "aaaa";
pCertInfo[1]->ver = 2;
pCertInfo[1]->name = "bbbb";
m_sa.Add(CComVariant(pCertInfo[0]));
m_sa.Add(CComVariant(pCertInfo[1]));
CComVariant var(m_sa);
var.Detach(pvar);
return S_OK;
}

在页面中加入
<object id="myCerts" name="myCerts"
classid="clsid:F8C1139D-1E86-4026-ABDA-094A2DEFDA04">
</object>
javascript代码:
function UpdateList()
{
var i = 0;
var arrayCerts = myCerts.getArray();
//希望能像这样使用返回的数组
for(var i = 0; i < arrayCerts.length ; i++) {
//或者这样也行for(var nCntr = arrayCerts.lbound(1); nCntr <= arrayCerts.ubound(1); nCntr++)
var oOption = document.createElement("OPTION");
oOption.text = arrayCerts[i].name; //

CmyCerts::getArray()的实现可能有问题,不知道该怎么写,请问该怎么做,是不是需要把结构定义写到idl文件中去?
在页面中该如何取得返回的自定义结构数组,如何使用呢?
如果有点COM和javascript的源代码更好,只需要很简单的自定义结构数组传输和调用的例子就好,希望能给点提示,谢谢啦
分不够我再加呃
...全文
972 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿振 2011-01-26
  • 打赏
  • 举报
回复
将需要返回的结构体数值转换成字符串形式的Hex数组,返回后在Javascript中转。这样做比较稳妥。
dannylee322 2009-07-03
  • 打赏
  • 举报
回复
自己ding+mark
upgrade_007 2009-07-03
  • 打赏
  • 举报
回复
mark xia
dannylee322 2009-07-02
  • 打赏
  • 举报
回复
18楼的方法我已经试过,也试过用二维数组的方式,但是不是很合适,还是希望用传结构体数组的方式来做,在网上搜到不少,但是都不是很全,而且大部分是针对应用程序的客户端的,和在网页上调用有一定区别。
现在用的下面这种方式,在idl中申明了结构体:
typedef [uuid(0EB91BCB-9F5D-4989-A443-61D3E2658C7E),
version(1.0),
helpstring("MyStruct of Certificates")]
struct MyStruct
{
BSTR CommonName;
long NotBefore;
}MyStruct;
在cpp中增加:
const GUID IID_STRUCT_MyStruct ={ 0x0EB91BCB, 0x9F5D, 0x4989, {0xA4, 0x43, 0x61, 0xD3, 0xE2, 0x65, 0x8C, 0x7E }};
实现代码:
STDMETHODIMP CmyCerts::getstruc(SAFEARRAY** aaa)//pBookMarkNames
{
IRecordInfo* pRecordInfo=NULL;
HRESULT hR=GetRecordInfoFromGuids(LIBID_myPTALib,1,0,GetUserDefaultLCID(),IID_STRUCT_MyStruct ,&pRecordInfo);
if(!SUCCEEDED(hR))
return FALSE;

/*创建大小为5个元素的自定义结构的数组--该结构内还有成员为数组*/
*aaa=SafeArrayCreateVectorEx(VT_RECORD,0,5 ,(void *)pRecordInfo);
MyStruct *pData=0;
hR=SafeArrayAccessData(*aaa,(void **)&pData);
if(!SUCCEEDED(hR))
return FALSE;
for(int i=0;i<5;i++)
{
pData[i].NotBefore=i*100*(i+1);
pData[i].CommonName = L"第一次";//"asdf";
}
SafeArrayUnaccessData(*aaa);
pRecordInfo->Release();
return S_OK;
}
编译成功,但是在javascript中无法调用
var t_Certs = myCOM.getstruc(); // myCOM为组件的object名称,可执行此步
后面该如何取返回的结构体数组的各个元素就不知道了
var ab = t_Certs(0).CommonName;//出错

不是我懒呃
forimprove 2009-07-02
  • 打赏
  • 举报
回复
Mark
z888c 2009-07-01
  • 打赏
  • 举报
回复
VBArray
做鸡真好吃 2009-07-01
  • 打赏
  • 举报
回复
mark~
oyljerry 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 dannylee322 的回复:]
只要最简单的能传出结构体数组,页面接收并显示结构体数组各元素的例子就可以了啊。。。
[/Quote]
你18楼不是提到了方法,为什么不自己试试.
dannylee322 2009-07-01
  • 打赏
  • 举报
回复
只要最简单的能传出结构体数组,页面接收并显示结构体数组各元素的例子就可以了啊。。。
marrco2005 2009-06-30
  • 打赏
  • 举报
回复
mark
dannylee322 2009-06-30
  • 打赏
  • 举报
回复
将结构体数组打包成XML,再在页面中分解出来?
华亭真人 2009-06-29
  • 打赏
  • 举报
回复
传XML出去,我们的项目就是这么做的
wsmyaoquhuawei 2009-06-27
  • 打赏
  • 举报
回复
well done
woyaozixuevcmfc 2009-06-27
  • 打赏
  • 举报
回复
well
woneedjob 2009-06-27
  • 打赏
  • 举报
回复
good
oldCanISoftware 2009-06-27
  • 打赏
  • 举报
回复
up
msdn2009_2010 2009-06-27
  • 打赏
  • 举报
回复
up
oyljerry 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 z888c 的回复:]
我想 可以采取拙劣一点方法
也是SAFEARRAY
但是里面的数据是这样的 VARIANT BSTR VARIANT BSTR VARIANT BSTR VARIANT BSTR VARIANT BSTR ...

VARIANT:ver
BSTR:name

在javascript里得到数组后再解析,那就很容易了,不过感觉。。。。。
不知道谁有更好一点的方法??
[/Quote]
对于结构体一般就是这么做了,或者用json方式,类似于map的方式,这样的数据,Javascript可以直接通过类似于key的方式获取value
bragi523 2009-06-27
  • 打赏
  • 举报
回复
mark
z888c 2009-06-27
  • 打赏
  • 举报
回复
我想 可以采取拙劣一点方法
也是SAFEARRAY
但是里面的数据是这样的 VARIANT BSTR VARIANT BSTR VARIANT BSTR VARIANT BSTR VARIANT BSTR ...

VARIANT:ver
BSTR:name

在javascript里得到数组后再解析,那就很容易了,不过感觉。。。。。
不知道谁有更好一点的方法??
加载更多回复(17)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧