如何构造一个元素类型为Struct的SafeArray

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在有些时候,我们需要构造一个元素类型为StructSafeArray,在MSDN并没有文档解释到底应该如何去做到这一点,下面的代码片断解释了如何去构造这样一个SafeArray

假设我们有如下的Struct

struct myStruct

{

    unsigned char Name[255];

    short Kind;

};

 

为了构造一个SafeArray,元素类型为mxStruct,首先我们必须得拿到mxStruct所对应的IRecordInfo接口,这可以通过调用GetRecordInfoFromGuids函数实现:

    #import "TestStruct.tlb" no_namespace

 

    HRESULT hr;

    IRecordInfo *pRecordInfo;

    hr = GetRecordInfoFromGuids(

        __uuidof(TestStruct),

        1,

        0,

        LOCALE_USER_DEFAULT,

        __uuidof(mxStruct),

        &pRecordInfo);

 

GetRecordInfoFromGuids在注册表中查询对应的Record信息,这个注册表信息位于HKCR/Record下,同时,对应的TypeLib也必须被注册在HKCR/TypeLib下面,这样GetRecordInfoFromGuids才可以查到对应的信息并返回IRecordInfo*指针。当获得了这个指针的时候,便可以通过CreateSafeArrayVectorEx来构造SafeArray

      SAFEARRAY *pArray = SafeArrayCreateVectorEx(VT_RECORD, 0, 3, pRecordInfo);

 

该行调用SafeArrayCreateVectorEx构造一个元素为pRecordInfo指定的结构,也就是myStructSafeArrayLowBound0,元素个数为3

对这个SafeArray中的元素赋值可以通过SafeArrayAccessDataSafeArrayUnaccessData做到:

    myStruct *pStructs;

    SafeArrayAccessData(pArray, (void **)&pStructs);

 

    strcpy((char *)&pStructs[0].Name[0], "N1");

    pStructs[0].Kind = 0;

 

    strcpy((char *)&pStructs[1].Name[0], "N2");

    pStructs[0].Kind = 1;

 

    strcpy((char *)&pStructs[2].Name[0], "N3");

    pStructs[0].Kind = 2;

 

    SafeArrayUnaccessData(pArray);

 

SafeArrayAccessData获得数组的指针,用于修改数据,并LockSafeArray,防止被SafeArray被释放。而SafeArrayUnaccessDataUnlock这个SafeArray

至此SafeArray构造完毕,可以传递给其他的COM组件了。如果有兴趣的话,可以参考MSDN Forum中提出的一个类似的问题:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1994951&SiteID=1&mode=1

 

vc做的ocx控件与vb等之间的自定义结构体数据传递 要使用safearray。ocx中包装数据:struct vv {      int   m;     int   n;    };VARIANT   varArray;   long i;  vv kk[10]; for(i=0;i  kk[i].m=i;  kk[i].n=i*i; } int   len=sizeof(vv);     SAFEARRAYBOUND   b 阅读详情

相关推荐

VARIANT 的高级应用

如何构造一个元素类型StructSafeArray: 在有些时候,我们需要构造一个元素类型StructSafeArray,在MSDN并没有文档解释到底应该如何去做到这一点,下面的代码片断解释了如何去构造这样一个SafeArray。假设我们有如下的Structstruct myStruct{unsigned char Name[255];short Kind;};为了构造一个Saf

Play up! 程序人生 ZQC 1293

SAFEARRAY使用实例

原文地址:http://www.chinaitpower.com/A200507/2005-07-27/168883.html目录:SAFEARRAY使用实例... 1目录:... 1前言:... 1何谓SAFEARRAY:... 1创建SAFEARRAY: 2方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组... 2方法二:使用Saf

珍爱生命 远离C++ 1784

SafeArray

首先介绍SafeArray使用,在介绍SafeArray中的结构。看完该节文章,SafeArray的陌生感一扫而去。   SafeArray 在ADO编程中经常使用。它的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成 SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型

lan354898254的专栏 1097

COM编程--字符串结构体转换

1、将结构体保存到VARIANT中 // @desc : 转为安全数组 HRESULT Hr; SAFEARRAY * pSArray; CComQIPtr spRecordInfo; Hr = ::GetRecordInfoFromGuids(LIBID_VT_CommUtiLib, 1, 0, LOCALE_USER_DEFAULT, __uuidof(TAvailableRoom)

qinwei4072880的专栏 1884
上一篇: Windows Vista真的只是加了新界面吗?
下一篇: 如何在NTFS文件系统中创建文件的Link
ATField
博客等级 码龄25年 673粉丝 119原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值