Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Копирование файлов с помощью шелла.

7.9K
26 июня 2006 года
x3dcoder
25 / / 25.12.2005
Здравствуйте, уважаемые программисты. Не могу разобраться в шелловских интерфейсах или пример какой-нибудь найти.
Вот, например, есть функция, которая показывает стандартный диалог свойств для файла (папки, диска) с помощью интерфейса 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();
}
}

Заранее спасибо.
14K
29 июня 2006 года
warchangel
39 / / 17.06.2006
насколько я въехал в ситуации изучая код своего файлового менеджера ( ты кстати не его аналог реализуешь ? :) сорри, паранойя :) ) IContextMenu получаеться для одного файла или группы файлов , и имно для них потом полностью и реализуються комманды cup & copy. объектно надо мыслить товарищи.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог