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

news/2024/7/3 12:22:33

在有些时候,我们需要构造一个元素类型为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

 





http://www.niftyadmin.cn/n/3658079.html

相关文章

嵌入式系统学习笔记(2)——单片机的硬件结构:引脚、CPU、存储器

8大部件,单一总线:微处理器、数据存储器、程序存储器、I/O口(P0-P3)、特殊功能寄存器、中断系统、定时/计数器、串行口 P0-P3是4个8位并行I/O口,其中P0口数据地址分时复用,要特别注意串行口是全双工异步串行…

嵌入式系统学习笔记(3)——I/O口电路结构、时钟周期、复位

P1口写数据时,将数据写到D0口,向P1W发写信号,这时Q口输出D0,Q非口输出D非,导致P10口输出D0。读数据时,可以从锁存器读,也可以直接从P10管脚读,取决于P1R1和P1R2,而且读锁…

如何在NTFS文件系统中创建文件的Link

大部分朋友可能知道UNIX提供了创建文件的Link的功能,而用过Windows的NTFS文件系统所支持的Link功能的朋友可能就没有那么多了(注意我说的不是Shortcut)。今天正好由于工作原因研究了一下相关内容,整理一下分享出来。本文简单介绍如…

win10自带截图工具

win10自带截图工具按winshifts可以呼出

.NET/CLR好书推荐

最近一直在看CLR方面的书籍,发现了几本不错的书,于是整理一下自己的感受放上来,希望能够对大家选择合适自己的书有所帮助。1. CLR via C#, 2nd Edition这本书不用我多说了。Jeffrey Richter的经典之作。条理清晰,深入浅出&…

.NET中的幕后英雄:MSCOREE.DLL

现在做.NET Framework的开发的朋友应该是越来越多了,但是可能并非人人都对MSCOREE.DLL非常了解。而事实上,毫不夸张地说,MSCOREE.DLL是.NET Framework中最为核心的DLL之一,没有这个DLL,托管程序根本无法开始执行起来&a…

嵌入式系统学习笔记(4)——指令系统(1)

注意不能MOVR0,R1MOV R_0, R_1MOVR0​,R1​ 或是反过来 注意这里只能用ACC不能用A,A 和ACC是有区别的,详细看这里,这个很重要:A和ACC的区别 当采用Ri时,要先把高8位写入P2口,所以尽量避免用Ri来访问外部RAM…

走近Silverlight - 微软Silverlight上海开发团队Blog第二篇

Silverlight上海开发团队Blog第二篇,是对Silverlight技术的一个比较全面的介绍。本文转自http://blog.csdn.net/SilverlightShanghai/archive/2007/08/21/1753258.aspx如果有对于Silverlight技术本身的疑问,看法,意见,建议&#x…