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

    技术2022-05-11  47

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

     

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1739633


    最新回复(0)