您的位置:首页 > Web前端

SAFEARRAY传递自定义结构体

2015-12-03 14:58 375 查看
创建包含结构的一维数组

使用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: