社区
ATL
帖子详情
怎么样把字符串,从 VARIANT* 转到 SAFEARRAY* ?
kb1024
2004-08-15 03:53:42
怎么样把字符串,从 VARIANT* 转到 SAFEARRAY* ?
谢谢!
...全文
353
5
打赏
收藏
怎么样把字符串,从 VARIANT* 转到 SAFEARRAY* ?
怎么样把字符串,从 VARIANT* 转到 SAFEARRAY* ? 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lineuser
2005-08-31
打赏
举报
回复
学习
wutianmeng
2004-09-06
打赏
举报
回复
直接用COleSafeArray的构造函数
VARIANT vt;
COleSafeArray ar(vt);
sohou
2004-08-16
打赏
举报
回复
你一个个自己传过去不就可以了,字符串说白了还不是一个数组
wangweixing2000
2004-08-16
打赏
举报
回复
薄荷兄说的对!
bluebohe
2004-08-15
打赏
举报
回复
你说得不具体,不知道是要怎么存的,你看一下下面的,应该是SafeArrayPutElement吧
12. 使用SafeArray问题
学会使用SafeArray也是很重要的,因为在ADO编程中经常要用。它的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。
使用SafeArray的具体步骤:
方法一:
包装一个SafeArray:
(1). 定义变量,如:
VARIANT varChunk;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
(2). 创建SafeArray描述符:
uIsRead=f.Read(bVal,ChunkSize);//read array from a file.
if(uIsRead==0)break;
rgsabound[0].cElements =uIsRead;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
(3). 放置数据元素到SafeArray:
for(long index=0;index<uIsRead;index++)
{
if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
::MessageBox(NULL,"出毛病了。","提示",MB_OK | MB_ICONWARNING);
}
一个一个地放,挺麻烦的。
(4). 封装到VARIANT内:
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa;
这样就可以将varChunk作为参数传送出去了。
读取SafeArray中的数据的步骤:
(1). 用SafeArrayGetElement一个一个地读
BYTE buf[lIsRead];
for(long index=0;index<lIsRead;index++)
{
::SafeArrayGetElement(varChunk.parray,&index,buf+index);
}
就读到缓冲区buf里了。
方法二:
使用SafeArrayAccessData直接读写SafeArray的缓冲区:
(1). 读缓冲区:
BYTE *buf;
SafeArrayAccessData(varChunk.parray, (void **)&buf);
f.Write(buf,lIsRead);
SafeArrayUnaccessData(varChunk.parray);
(2). 写缓冲区:
BYTE *buf;
::SafeArrayAccessData(psa, (void **)&buf);
for(long index=0;index<uIsRead;index++)
{
buf[index]=bVal[index];
}
::SafeArrayUnaccessData(psa);
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa;
这种方法读写SafeArray都可以,它直接操纵SafeArray的数据缓冲区,比用SafeArrayGetElement和SafeArrayPutElement速度快。特别适合于读取数据。但用完之后不要忘了调用::SafeArrayUnaccessData(psa),否则会出错的。
Variant
输入出参数,ocx传递byte数组,
saf
ear
ray
使用方法,vc写ocx在vb下调用
Variant
输入出参数,ocx传递byte数组,
saf
ear
ray
使用方法,vc写ocx在vb下调用
Saf
eAr
ray
使用.doc
本文档主要讲述的是
Saf
eAr
ray
使用;
Saf
eAr
ray
是VB中的数组存储方式。通过
Saf
eAr
ray
,可以在VC++和VB间相互调用。
Saf
eAr
ray
也是Automation中的标准数组存储方式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
VC++中
字符串
的处理
CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的
字符串
(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和
字符串
操作方法。typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;
com组件编程参数类型转换
VC++ 在com组件编程中经常遇见类型转换问题,这里提供了几种方法
Java通过Jacob调用ActiveX,进行二进制数据交换
该工程项目演示了Java通过jacob1.17调用ActiveX的基本方法。对于单个的基本类型的数据(byte、short、long、BOOL)等类型的数据,以及有很多字节组成的可见英文字符、汉字等组成的
字符串
(LPCTSTR、BSTR类型都会进行编码转换)来说,使用VC的ActiveX项目向导可以方便地实现;对于二进制数据的交换必须使用
Variant
类型,但是在实际使用过程中使用VC2008ActiveX项目向导生成的ocx触发事件中带有
Variant
类型的参数时,ocx控件在触发事件消息之后就会出现内存异常,导致程序无法正常运行,而采用VC6.0生成的事件触发代码就运行正常,不知道是什么原因。采用
Variant
的
Saf
eAr
ray
数据类型可以实现二进制数据的交换,通过
Saf
eAr
ray
CreateVector创建数据缓存空间,
Saf
eAr
ray
AccessData锁定内存数据块,
Saf
eAr
ray
UnaccessData解除内存数据块的锁定,
Saf
eAr
ray
Destroy释放内存数据空间。
ATL
3,248
社区成员
48,529
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章