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;
}
使用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;
}
相关文章推荐
- JSP 页面中用绝对路径显示图片
- nodejs+express+jade创建新文件
- js获取height为auto的高度问题
- JavaScript写的图片库功能(小图变大图查看浏览)
- css规范
- javascript实现二级菜单联动源码---人人看的懂!
- 详解JavaScript对象和数组
- smarty框架中 点击即可编辑标题的 jquery实现代码
- 一个form表单包含多个submit提交动作
- 史上最全的CSS hack方式一览
- js平滑滚动到顶部,底部,指定地方
- JavaScript闭包封装,继承
- 前端组件库集合
- angularjs中provider、factory和service三者的写法与区别
- 史上最全的CSS hack方式一览
- jquery 弹出框插件 dialog使用介绍
- CSS a 标签样式
- 树链剖分+线段树 poj2763 Housewife Wind
- HTML规范
- jquery给input标签赋值时出现value有值页面没显示的情况