SAFEARRAY传递自定义结构体

创建包含结构的一维数组


使用safearray传递udt(自定义结构)是一项常用的技术,msdn文档描述得比较齐全,要注意的一点是,自定义结构要求有自己的guid,这必须在idl文件中定义。同时还必须要使用irecordinfo接口,该接口将和数组一起传递出去,irecordinfo接口内部记录了udt的描述信息。


idl文件中:


[uuid(810930aa-9229-46e7-b20c-41f6218d0b1a)]
struct _bookmarkschema
{
BSTR name;
BSTR context;
BSTR time;
};
...


interface IShape : IDispatch
{
[id(6), helpstring(获取属于某用户的书签名称列表)] hresult getbookmarkname([in] bstr userid,[out] safearray(struct _bookmarkschema)* pbookmarknames);
};


library sarstshapelib
{


importlib(stdole2.tlb);
[
uuid(dbdcc0f1-38f3-4eb4-a5bd-79a3707bde9c),
helpstring(shape class)
]
coclass shape
{
[default] interface ishape;
};


struct _bookmarkschema;
};


方法的实现为:


stdmethodimp cshape::getbookmarkname(bstr userid,safearray** pbookmarknames)
{
//获得gis库信息


csarstconfigure configure;
string flag(gis);
string ip,database,username,key,context;
configure.getdatabaseinfo(flag,ip,database,username,key,context);


//读取图层属性数据
string user(cstring(userid).getbuffer());
string sql(select 书签名,书签描述,时间 from 用户书签表 where 用户id= user order by 时间 desc);
fbdata data(ip,database,username,key);


table t=data.gettable(sql);


if(t.empty())
{
return s_false;
}
//创建safearray
IRecordInfo* precordinfo=null;
HRESULT hr=::GetRecordInfoFromGuids(libid_sarstshapelib,1,0,getuserdefaultlcid(),__uuidof(_bookmarkschema),&precordinfo);
if(failed(hr))
return e_fail;
*pbookmarknames=::safearraycreatevectorex(vt_record,0,long(t.size()-1),(void*)precordinfo);
_bookmarkschema* pdata=null;
hr=::safearrayaccessdata(*pbookmarknames,(void**)&pdata);
for(int i=0;i<int(t.size()-1);i )
{
t[i 1].at(0).copyto(&pdata[i].name);
t[i 1].at(1).copyto(&pdata[i].context);
t[i 1].at(2).changetype(vt_bstr);
t[i 1].at(2).copyto(&pdata[i].time);
}


::SafeArrayUnaccessData(*pbookmarknames);
precordinfo->release();
return s_ok;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值