Здравствуйте, idiMAN, Вы писали:
MAN>2) Как сделать чтобы при открытии моей виртуальной папки, отображающей компьютер, происходило перенаправление на браузинг этого компьютера, т.е. открывалось окно \\Computer
Можно попробовать определить CLSID компоненты, которая обслуживает эту ветку. И самому создавать этот объект.
Согласись, гениальная идея
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, idiMAN, Вы писали:
MAN>2) Как сделать чтобы при открытии моей виртуальной папки, отображающей компьютер, происходило перенаправление на браузинг этого компьютера, т.е. открывалось окно \\Computer
#include <ShlObj.h>
//////////////////////////////////////////////////////////////////////////
int main(int _c, char *argv[])
{
__Verify(SUCCEEDED(OleInitialize(NULL)));
{
CComPtr<IShellFolder> PtrIShellFolder;
HRESULT hr = SHGetDesktopFolder(&PtrIShellFolder);
if (SUCCEEDED(hr))
{
ULONG nEaten = 0;
ULONG nAttributes = 0;
CComPtr<IMalloc> PtrIMalloc;
__Verify(SUCCEEDED(SHGetMalloc(&PtrIMalloc)));
LPITEMIDLIST pidl;
hr = PtrIShellFolder->ParseDisplayName(NULL,
NULL,
L"\\\\computer_of_your_domain",
&nEaten,
&pidl,
&nAttributes);
if (SUCCEEDED(hr))
{
// На клик можно отдавать указатель на этот интерфейс или пидл полученый выше
CComPtr<IShellFolder> PtrINetFolder;
hr = PtrIShellFolder->BindToObject(pidl,
NULL,
IID_IShellFolder,
(PVOID*)&PtrINetFolder);
if (SUCCEEDED(hr))
{
CComPtr<IEnumIDList> PtrIEnumIDLIST;
hr = PtrINetFolder->EnumObjects(NULL,
SHCONTF_FOLDERS|SHCONTF_NONFOLDERS,
&PtrIEnumIDLIST);
if (SUCCEEDED(hr))
{
ULONG nFetch;
LPITEMIDLIST pidl2;
while(PtrIEnumIDLIST->Next(1, &pidl2, &nFetch) == S_OK)
{
STRRET str;
if (SUCCEEDED(PtrINetFolder->GetDisplayNameOf(pidl2,
SHGDN_NORMAL,
&str)))
{
if (str.uType == STRRET_CSTR)
{
_tprintf(__T("%s\n"), str.cStr);
}
else if (str.uType == STRRET_WSTR)
{
_tprintf(__T("%ls\n"), str.pOleStr);
PtrIMalloc->Free(str.pOleStr);
}
}
PtrIMalloc->Free(pidl2);
}
}
}
PtrIMalloc->Free(pidl);
}
}
}
CoUninitialize();
}
Надеюсь поможет
Здравствуйте, EDimon, Вы писали:
ED>int main(int _c, char *argv[])
ED>{
ED> __Verify(SUCCEEDED(OleInitialize(NULL)));
ED> {
ED> CComPtr<IShellFolder> PtrIShellFolder;
ED> HRESULT hr = SHGetDesktopFolder(&PtrIShellFolder);
ED> if (SUCCEEDED(hr))
ED> {
ED> ULONG nEaten = 0;
ED> ULONG nAttributes = 0;
ED> CComPtr<IMalloc> PtrIMalloc;
ED> __Verify(SUCCEEDED(SHGetMalloc(&PtrIMalloc)));
ED> LPITEMIDLIST pidl;
ED> hr = PtrIShellFolder->ParseDisplayName(NULL,
ED> NULL,
ED> L"\\\\computer_of_your_domain",
ED> &nEaten,
ED> &pidl,
ED> &nAttributes);
ED> if (SUCCEEDED(hr))
ED> {
ED> // На клик можно отдавать указатель на этот интерфейс или пидл полученый выше
ED> CComPtr<IShellFolder> PtrINetFolder;
ED> hr = PtrIShellFolder->BindToObject(pidl,
ED> NULL,
ED> IID_IShellFolder,
ED> (PVOID*)&PtrINetFolder);
...
ED>
ED>Надеюсь поможет
Помогло
Большое спасибо за совет, чесно сказать я уже прочитал на сайте статью Игоря Вартанова
"Как получить ITEMIDLIST для заданного файла или каталога?"Автор(ы): Игорь Вартанов
, где как раз описывается рекомендованный Вами способ, коим я и воспользовался.
Я получаю pidl для "\\Computer" и в методе IContextMenu.InvokeCommand вызываю IShellBrowser.BrowseObject(pidl, SBSP_DEFBROWSER or SBSP_OPENMODE or SBSP_ABSOLUTE), т.е при клике передаю pidl. А вот с передачей интерфейса через IShellFolder.BindToObject что-то не получается, посто я пока не смог написать реализацию данного метода в случае если на вход передается multi-level pidl, а написал только для single-level pidl. Может кто подскажет как правильно реализовать обработку multi-level pidl в методе IShellFolder.BindToObject.