Копирование файлов с помощью шелла.
Вот, например, есть функция, которая показывает стандартный диалог свойств для файла (папки, диска) с помощью интерфейса IContextMenu.
Я хочу использовать этот интерфейс для команд copy и cut. Но нужно как-то сообщить интерфейсу список файлов и папок, которые нужно копировать, а как я не знаю. Или как это вообще можно лучше реализовать?
void CChildView:: DisplayPropertiesDlg(LPCTSTR filename)
{
HRESULT hr;
LPMALLOC pMalloc = NULL;
LPSHELLFOLDER desktop = NULL, pfolder=NULL;
LPCONTEXTMENU mnu = NULL;
LPITEMIDLIST pidl = NULL, pLastId=NULL;
CMINVOKECOMMANDINFO cmd;
WCHAR fwname[MAX_PATH+1];
int i=0;
ULONG attr=SFGAO_FILESYSTEM;
USHORT temp;
// convert filename to wide string
memset(fwname, L'\0', (MAX_PATH+1)*sizeof(WCHAR));
MultiByteToWideChar(CP_THREAD_ACP, 0, filename, -1, fwname, MAX_PATH);
hr = SHGetMalloc(&pMalloc);
if(SUCCEEDED(hr))
__try
{
hr = SHGetDesktopFolder(&desktop);
if(SUCCEEDED(hr))
__try
{
hr = desktop->ParseDisplayName(m_hWnd, NULL, fwname, NULL, &pidl, &attr);
if(SUCCEEDED(hr))
__try
{
// prepare to bind object
pLastId = pidl;
while(1)
{
int offset = pLastId->mkid.cb;
temp = *(USHORT*)((BYTE*)pLastId + offset);
if(!temp)break;
pLastId = (LPITEMIDLIST)((BYTE*)pLastId + offset);
}
temp = pLastId->mkid.cb;
pLastId->mkid.cb = 0;
// bind object
// if(SFGAO_FOLDER & attr)
// folder
hr = desktop->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&pfolder);
// else
// file
// hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&pfolder, NULL);
// get context menu interface
pLastId->mkid.cb = temp;
hr = pfolder->GetUIObjectOf(m_hWnd, 1,(LPCITEMIDLIST*)(&pLastId), IID_IContextMenu, NULL, (void**)&mnu);
if(SUCCEEDED(hr))
__try
{
memset(&cmd, 0, sizeof(cmd));
cmd.cbSize = sizeof(cmd);
cmd.fMask = 0;
cmd.hwnd = m_hWnd;
cmd.lpVerb = _T("Properties");
cmd.nShow = SW_SHOWNORMAL;
hr = mnu->InvokeCommand(&cmd);
}
__finally
{
mnu->Release();
}
}
__finally
{
pMalloc->Free(pidl);
}
}
__finally
{
desktop->Release();
}
}
__finally
{
pMalloc->Release();
}
}
Заранее спасибо.
насколько я въехал в ситуации изучая код своего файлового менеджера ( ты кстати не его аналог реализуешь ? :) сорри, паранойя :) ) IContextMenu получаеться для одного файла или группы файлов , и имно для них потом полностью и реализуються комманды cup & copy. объектно надо мыслить товарищи.