Как получить что то вроде сетевого окружения?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

Здрасти...
Подскажите как получить такую штуку вроде экплорера со списками компьютеров и папок и фалов в них ... подскажите хотя бы функции
Заранее спасибо.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

смотри SHELL объекты:

IShellFolder
IShellView
IShellBrowser
ICommDlgBrowser

Если не расберёшься как они взаимодействуют - то я помогу по конкретным воросам. Но только помогу. Всё за тебя сделать, к сожалению, не хватает времени. Сори.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

спасибо большое.
А все делать и не надо я так не люблю, да и уже не интерестно станет, да и вроде как своя голова на плечах есть
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну что, разобрался? Помощь не нужна?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

Да что-то не очень пока ... :(
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

И снова здрасти ))).
Посмотрел я функции ... МСДН красиво пишет, но не достаточно практично допустим есть функция:
HRESULT CreateViewObject(
HWND hwndOwner,
REFIID riid,
VOID **ppv
);

Parameters
hwndOwner
[in] Handle to the owner window. If you have implemented a custom folder view object, your folder view window should be created as a child of hwndOwner.
riid
[in] Identifier of the requested interface.
ppvOut
[out] Address of a pointer to the requested interface.

Что-то конечно понятно, но вот я задолбался :evil: искать какие значения может принимать REFIID riid и еще что вот это
ppvOut [out] Address of a pointer to the requested interface такое.



Поясните плиз что в этой функции как буду очень признателен.

и еще я написал что то вроде Total Comander, т.е. у меня есть простейший переход от папки к папке и выбор дисков на основе ListBox'а, вот ! А мне нужно к такой штуке привязать еще и сетевое окружение. Вот как такое можно сделать, точнее можно ли это сделать без использования IShellFolder и иже с ними ?

Заранее большое спасибо .
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

И снова здрасти :roll:

есть вот такая функция :
DWORD dwResult = ::WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
0, // enumerate all resources
lpnr, // NULL first time this function is called
&hEnum); // handle to resource

А ругается она так:
bot_ error LNK2019: unresolved external symbol _WNetOpenEnumA@20 referenced in function "public: __thiscall DlgPath: :D lgPath(struct HINSTANCE__ *,int,struct HWND__ *)" (??0DlgPath@@QAE@PAUHINSTANCE__@@HPAUHWND__@@@Z)

Помогите плиз.
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Насчет ошибки линкера надо видимо прописать библиотеку для линковки, в MSDN это - Mpr.lib

А по поводу IShellFolder вот хороший пример, опять же из ругаемого MSDN-а -

Код: Выделить всё

#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>

main()
{
    LPMALLOC pMalloc;
    LPITEMIDLIST pidlProgFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfFirstFolder = NULL;
    IShellFolder *psfDeskTop = NULL;
    IShellFolder *psfProgFiles = NULL;
    LPENUMIDLIST ppenum = NULL;
    ULONG celtFetched;
    HRESULT hr;
    STRRET strDispName;
    TCHAR pszDisplayName[MAX_PATH];
    ULONG uAttr;
    
    CoInitialize( NULL );
    hr = SHGetMalloc(&pMalloc);
	
    hr = SHGetFolderLocation(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, &pidlProgFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlProgFiles, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
    psfDeskTop->Release();

    hr = psfProgFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfProgFiles->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
        cout << pszDisplayName << '\n';
        if(!psfFirstFolder)
        {
            uAttr = SFGAO_FOLDER;
            psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
            if(uAttr & SFGAO_FOLDER)
            {
                hr = psfProgFiles->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
            }
        }
        pMalloc->Free(pidlItems);
    }

    cout << "\n\n";

    ppenum->Release();

    if(psfFirstFolder)
    {
        hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

        while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            psfFirstFolder->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
            StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
            cout << pszDisplayName << '\n';
            pMalloc->Free(pidlItems);
        }
    }

    ppenum->Release();
    pMalloc->Free(pidlProgFiles);
    pMalloc->Release();
    psfProgFiles->Release();
    psfFirstFolder->Release();

    CoUninitialize();
    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если тебе нужно получить просто весь перечень сетевых ресурсов, то воспользуйся примером, который любезно предоставил господин Hawk, если же тебе нужно именно окошко, наподобие OpenFileDialog'а, чтобы и контекстное меню автоматически вызывалось для каждого элемента сети и всякая иная виндовская лабуда автоматически выполнялась, то путь следующий (это только набросок):

1. Создаём COM-объект CMyBrowser, который имплементит интерфейсы IShellBrowser и ICommDlgBrowser (последний не обязательно, разберёшься сам почему).
2. Получаем IShellFolder интерфейс сетевого окружения в переменную spCurFolder.
3. Получаем с помощью spCurFolder->CreateViewObject (второй параметр выставляем как IID_IShellView) указатель на IShellView интерфейс.
4. Вызываем у последнего метод CreateViewWindow, которому нужно передать предыдущий IShellView (если такового не имеется, то NULL), заполненную структуру FOLDERSETTINGS, которую нужно или заполнять ручками, или, если предыдущий IShellView существует, то можно получить с помощью метода GetCurrentInfo и указатель на ShellBrowser object, он у нас имеется. (см. пункт 1)
5. В методе OnDefaultCommand нашего COM объекта CMyBrowser, получаем pidl текущего айтема, на который кликнул пользователь и вызываем метод spCurFolder->BindToObject, который даст нам указатель на IShellFolder (назовём его spNextFolder) для соответствующей поддиректории, затем запихиваем spCurFolder в std::stack (возможны вариации), затем делаем spCurFolder = spNextFolder и переходим на пункт 3.
6. Предусматриваем также на нашем диалоге кнопочку Back (могут быть вариции с toolbar) в хэндлере которой будет извлекаться из std::stack ShellFolder object в переменную spCurFolder и осуществляться переход на пункт 3.

Вот и всё.

P.S. Советую везде использовать смартпоинтеры, чтобы не заботится о Releas'ах. (например IShellFolderPtr, IShellViewPtr, IContextMenuPtr), если соответствующего смарт поинтера в в стандартных хеадерах не объявлено можно использовать темплэйты ComPtr или _com_ptr_t.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

Насчет последнего сообщения возникает вопрос, как в пункте 5 предполагается получить pidl текущего item-a?
Ведь в OnDefaultCommand приходит только указатель на IShellView, а у него запросить пидл стандартным способом нельзя.
Заранее спасибо
Ответить