3 /**************************************************************************
7 CEnumIDList::AddToEnumList(PITEMID_CHILD pidl
)
14 pNew
= static_cast<LPENUMLIST
>(SHAlloc(sizeof(ENUMLIST
)));
28 /*add the new item to the end of the list */
29 m_pLast
->pNext
= pNew
;
32 /*update the last item pointer */
39 CEnumIDList::CEnumIDList() :
47 CEnumIDList::~CEnumIDList()
54 m_pFirst
= pDelete
->pNext
;
55 SHFree(pDelete
->pidl
);
62 CEnumIDList::QueryInterface(
68 if (IsEqualIID(riid
, IID_IUnknown
) || IsEqualIID(riid
, IID_IEnumIDList
))
70 *ppvObj
= static_cast<IEnumIDList
*>(this);
82 ULONG refCount
= InterlockedIncrement(&m_ref
);
88 WINAPI
CEnumIDList::Release()
90 ULONG refCount
= InterlockedDecrement(&m_ref
);
102 PITEMID_CHILD
*rgelt
,
112 if (celt
> 1 && !pceltFetched
)
117 if (celt
> 0 && !m_pCurrent
)
122 for (i
= 0; i
< celt
; i
++)
127 temp
= ILClone(m_pCurrent
->pidl
);
129 m_pCurrent
= m_pCurrent
->pNext
;
140 CEnumIDList::Skip(ULONG celt
)
145 for (dwIndex
= 0; dwIndex
< celt
; dwIndex
++)
152 m_pCurrent
= m_pCurrent
->pNext
;
162 m_pCurrent
= m_pFirst
;
169 LPENUMIDLIST
* ppenum
)
174 LPPIDLDATA
_ILGetDataPointer(LPITEMIDLIST pidl
)
176 if (pidl
&& pidl
->mkid
.cb
!= 0x00)
177 return reinterpret_cast<LPPIDLDATA
>(&pidl
->mkid
.abID
);
181 LPITEMIDLIST
_ILAlloc(BYTE type
, unsigned int size
)
183 LPITEMIDLIST pidlOut
= NULL
;
185 pidlOut
= static_cast<LPITEMIDLIST
>(SHAlloc(size
+ 5));
190 ZeroMemory(pidlOut
, size
+ 5);
191 pidlOut
->mkid
.cb
= size
+ 3;
192 pData
= _ILGetDataPointer(pidlOut
);
201 PITEMID_CHILD
_ILCreateNetConnect()
203 PITEMID_CHILD pidlOut
;
205 pidlOut
= _ILAlloc(PT_GUID
, sizeof(PIDLDATA
));
208 LPPIDLDATA pData
= _ILGetDataPointer(pidlOut
);
210 memcpy(&(pData
->u
.guid
.guid
), &CLSID_ConnectionFolder
, sizeof(GUID
));
215 GUID
* _ILGetGUIDPointer(LPITEMIDLIST pidl
)
217 LPPIDLDATA pdata
= _ILGetDataPointer(pidl
);
222 if (pdata
->type
!= PT_GUID
)
225 return &(pdata
->u
.guid
.guid
);
229 BOOL
_ILIsNetConnect(LPCITEMIDLIST pidl
)
231 const IID
*piid
= _ILGetGUIDPointer(const_cast<LPITEMIDLIST
>(pidl
));
234 return IsEqualIID(*piid
, CLSID_ConnectionFolder
);
239 PITEMID_CHILD
ILCreateNetConnectItem(INetConnection
* pItem
)
244 pidl
= _ILAlloc(0x99, sizeof(PIDLDATA
));
245 pdata
= _ILGetDataPointer(pidl
);
246 pdata
->u
.value
.pItem
= pItem
;
251 const VALUEStruct
* _ILGetValueStruct(LPCITEMIDLIST pidl
)
253 LPPIDLDATA pdata
= _ILGetDataPointer(const_cast<LPITEMIDLIST
>(pidl
));
255 if (pdata
&& pdata
->type
==0x99)
256 return reinterpret_cast<const VALUEStruct
*>(&pdata
->u
.value
);