关于STGMEDIUM中的CIDA结构体浅析

编程入门 行业动态 更新时间:2024-10-24 23:15:10

关于STGMEDIUM中的CIDA<a href=https://www.elefans.com/category/jswz/34/1771419.html style=结构体浅析"/>

关于STGMEDIUM中的CIDA结构体浅析

最近工作中碰到了在shell extension 中遇到了CIDA结构体。

DataObject通过setData的方式,将FORMATETC数据和STGMEDIUM设置到类中,而STGMEDIUM中是一块内存,涉及了CIDA结构体。

首先看下CIDA的结构体

typedef struct _IDA {UINT cidl;          // number of relative IDListUINT aoffset[1];    // [0]: folder IDList, [1]-[cidl]: item IDList
} CIDA, * LPIDA;

通过对该结构体数据的填充,最后将该内存拷贝到STGMEDIUM的hGlobal句柄上。

其数据填充如下:

首先cidl代表了要填充的ITEMIDLIST的数量。

aoffset代表了ITEMIDLIST内存起始的偏移量。

整块内存分布为:

CIDA + ParentIDList+ IDList+(0 0)以2个0结尾。

其中CIDA占用的长度是不定的,当IDList数量为1时,ICDA中的aoffset数组是2个,占用8字节,cidl占用4字节,即CIDA一共占用12字节,其中aoffset的2个UINT分别为ParentIDList偏移量和IDList的偏移量。

举个例子:

当ParentIDList长度为480字节,IDList长度为460字节。那么CIDA中的

aoffset[0]=12

aoffset[1]=492

解析代码为:

		LPIDA pida = (LPIDA)pmediumIn->hGlobal;CComPtr<IShellFolder> ppsf;LPCITEMIDLIST pidlParent = (LPCITEMIDLIST)(((LPBYTE)pida) + (pida)->aoffset[0]);hr = SHBindToObject(NULL, pidlParent, NULL, IID_PPV_ARGS(&ppsf));pidlList.resize(pida->cidl + 1);for (UINT i = 0; SUCCEEDED(hr) && i < pida->cidl + 1; i++) // +1, the parent element was first, and we are includeing it, it is also an PCIDLIST_ABSOLUTE{pidlList[i] = (LPCITEMIDLIST)(((LPBYTE)pida) + (pida)->aoffset[i]);}

暂时先记录到这里。后续有时间再跟进和贴图吧,

更多推荐

关于STGMEDIUM中的CIDA结构体浅析

本文发布于:2024-02-12 14:27:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1688164.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:结构   STGMEDIUM   CIDA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!