Страница 1 из 2
Как получить что то вроде сетевого окружения?
Добавлено: 01 июл 2004, 13:46
Носферату
Здрасти...
Подскажите как получить такую штуку вроде экплорера со списками компьютеров и папок и фалов в них ... подскажите хотя бы функции
Заранее спасибо.
Добавлено: 01 июл 2004, 14:10
Romeo
смотри SHELL объекты:
IShellFolder
IShellView
IShellBrowser
ICommDlgBrowser
Если не расберёшься как они взаимодействуют - то я помогу по конкретным воросам. Но только помогу. Всё за тебя сделать, к сожалению, не хватает времени. Сори.
Добавлено: 01 июл 2004, 15:25
Носферату
спасибо большое.
А все делать и не надо я так не люблю, да и уже не интерестно станет, да и вроде как своя голова на плечах есть
Добавлено: 05 июл 2004, 19:31
Romeo
Ну что, разобрался? Помощь не нужна?
Добавлено: 17 июл 2004, 14:45
Носферату
Да что-то не очень пока ...

Добавлено: 19 июл 2004, 01:40
Носферату
И снова здрасти ))).
Посмотрел я функции ... МСДН красиво пишет, но не достаточно практично допустим есть функция:
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 и иже с ними ?
Заранее большое спасибо .
Добавлено: 19 июл 2004, 22:51
Носферату
И снова здрасти :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:

lgPath(struct HINSTANCE__ *,int,struct HWND__ *)" (??0DlgPath@@QAE@PAUHINSTANCE__@@HPAUHWND__@@@Z)
Помогите плиз.
Добавлено: 20 июл 2004, 10:56
Hawk
Насчет ошибки линкера надо видимо прописать библиотеку для линковки, в 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;
}
Добавлено: 02 авг 2004, 11:24
Romeo
Если тебе нужно получить просто весь перечень сетевых ресурсов, то воспользуйся примером, который любезно предоставил господин 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.
Добавлено: 03 мар 2005, 17:35
Sera
Насчет последнего сообщения возникает вопрос, как в пункте 5 предполагается получить pidl текущего item-a?
Ведь в OnDefaultCommand приходит только указатель на IShellView, а у него запросить пидл стандартным способом нельзя.
Заранее спасибо