Код: Выделить всё
struct CGlobalLock
{
CGlobalLock(HGLOBAL hMem)
: m_hMem(hMem)
{
m_pMem = ::GlobalLock(m_hMem);
}
~CGlobalLock()
{
if (m_hMem != NULL)
{
::GlobalUnlock(m_hMem);
}
}
HGLOBAL m_hMem;
LPVOID m_pMem;
};
struct CStgMedium : public STGMEDIUM
{
CStgMedium()
{
tymed = 0;
hGlobal = NULL;
pUnkForRelease = NULL;
}
~CStgMedium()
{
::ReleaseStgMedium(this);
}
};
PIDLWrapper GetSelectedItem(IShellView* pShellView, UINT uItem)
{
HRESULT hr = S_OK;
IDataObjectPtr spDataItem;
hr = pShellView->GetItemObject(uItem, IID_IDataObject, (void**)&spDataItem);
if (FAILED(hr) || spDataItem == NULL)
{
return NULL;
}
FORMATETC fetc;
fetc.cfFormat = CF_IDLIST;
fetc.dwAspect = DVASPECT_CONTENT;
fetc.ptd = NULL;
fetc.lindex = -1;
fetc.tymed = TYMED_HGLOBAL;
hr = spDataItem->QueryGetData(&fetc);
ATLASSERT(SUCCEEDED(hr));
CStgMedium stgmed;
hr = spDataItem->GetData(&fetc, &stgmed);
ATLASSERT(SUCCEEDED(hr));
CGlobalLock gl(stgmed.hGlobal);
CIDA* pData = (CIDA*)gl.m_pMem;
ATLASSERT(pData != NULL);
if (pData == NULL || pData->cidl < 1)
{
return NULL;
}
UINT offset = pData->aoffset[1];
char* pcData = reinterpret_cast<char*>(pData) + offset;
LPITEMIDLIST pidlSource = (LPITEMIDLIST)pcData;
return PIDLWrapper(pidlSource); // copy pidlSource
}
Код: Выделить всё
PIDLWrapper pidl = GetSelectedItem(m_spShellView, SVGIO_SELECTION);
Код: Выделить всё
CF_IDLIST = ::RegisterClipboardFormat(CFSTR_SHELLIDLIST);
Удачи.