Shell Name Space Extension
От: idiMAN  
Дата: 17.01.05 09:03
Оценка:
Добрый день!

Я пишу дополнение к Explorer, которое отображается как виртуальная папка с точкой монтирования в "Сетевое окружение". Суть этого дополнения — упорядочить расположение компьютеров в сети в соответствии с организационной структурой предприятия, а так они расположены в одном домене, что крайне не удобно при браузинге. Так вот у меня есть несколько вопосов:

1) IShellView я реализовал через вызов SHCreateShellFolderView, как теперь заставить Explorer показывать своё стандартное контекстное меню с пунктами "Открыть", "Проводник", "Свойства", "Создать ярлык" и как сделать чтобы он их обрабатывал, т.е. открывал соответствующую папку, показывал её свойсва, создавал ярлык и реагировал на double-click

2) Как сделать чтобы при открытии моей виртуальной папки, отображающей компьютер, происходило перенаправление на браузинг этого компьютера, т.е. открывалось окно \\Computer

С уважением,
Чусов Дмитрий.
Re: Shell Name Space Extension
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 17.01.05 09:16
Оценка:
Здравствуйте, idiMAN, Вы писали:

MAN>2) Как сделать чтобы при открытии моей виртуальной папки, отображающей компьютер, происходило перенаправление на браузинг этого компьютера, т.е. открывалось окно \\Computer


Можно попробовать определить CLSID компоненты, которая обслуживает эту ветку. И самому создавать этот объект.

Согласись, гениальная идея
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Shell Name Space Extension
От: EDimon  
Дата: 17.01.05 13:46
Оценка: 1 (1)
Здравствуйте, 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();
}


Надеюсь поможет
Re[2]: Shell Name Space Extension
От: idiMAN  
Дата: 18.01.05 08:05
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.