PDA

Просмотр полной версии : Получение списка расшаренных файлов локальной сети



crack
26.12.2004, 16:24
Всем привет,
встала передо мной задача получения имён всех расшаренных файлов локальной сети. Попробовал использовать WNetEnumResource(...), но выдаётся только список share ресурсов какого либо компа, но необходимо получить имена всех вложенных папок и файлов. Подскажите пожалуйста, как можно такое осуществить, в каком направлении продвигаться?

Romeo
27.12.2004, 15:53
С помощью функции SHGetSpecialFolderLocation получим pidl сетевого окружения. Затем, используя интерфейс IShellFolder и его метод BindToObject, "войдём" в нужную сетевую папку и воспользуемся методом EnumObjects для получения списка её содержимого. Если имя компьюютера фиксировано, то можно воспользоваться методом ParseDisplayName у desktop-объекта (указатель на IShellFolder интерфейс которого можно предварительно получить, воспользовавшись SHGetDesktopFolder шелом) и получить соответствующий ShellFolder. Далее тот же приём: вызываем EnumObjects.

crack
27.12.2004, 23:28
Получаю pidl на CSIDL_NETWORK(если я всё правильно понял) но мне остаётся непонятным как войти в конкретную папку на удалённом компе? Где указать её имя? Заранее извиняюсь за может быть глупые вопросы, но опыта подобного программироапния у меня совсем мало:(

Romeo
28.12.2004, 12:49
Ещё раз говорю, если удалённый компьютер фиксирован, то достаточно выполнить следующие манипуляции:


void SHGetNameByFlag( LPSHELLFOLDER lpParentFolder, LPCITEMIDLIST lpItemIDList, LPTSTR lpszFileName, DWORD uMaxLen, DWORD uFlags)
{
ATLASSERT(lpParentFolder != NULL);
ATLASSERT(lpItemIDList != NULL);

STRRET stStrRet;
stStrRet.uType = STRRET_CSTR;

HRESULT hr = lpParentFolder->GetDisplayNameOf(lpItemIDList, uFlags, &stStrRet);
ATLASSERT(SUCCEEDED(hr));

switch(stStrRet.uType)
{
case STRRET_CSTR:
{
_tcsncpy(lpszFileName, _bstr_t(stStrRet.cStr), uMaxLen);
break;
}

case STRRET_WSTR:
{
IMallocPtr spMalloc;
::SHGetMalloc(&spMalloc);

_tcsncpy(lpszFileName, _bstr_t(stStrRet.pOleStr), uMaxLen);
spMalloc->Free(stStrRet.pOleStr);
break;
}

case STRRET_OFFSET:
{
_tcsncpy(lpszFileName, _bstr_t((CHAR *)lpItemIDList + stStrRet.uOffset), uMaxLen);
break;
}
}
}

void main()
{
IShellFolderPtr spDesktop;
SHGetDesktopFolder(&spDesktop);

IMallocPtr spMalloc;
SHGetMalloc(&spMalloc);

LPITEMIDLIST pidl;
spDesktop->ParseDisplayName((NULL, NULL, L"\\RemoteComputer\Install\Players\WinAmp", NULL, &pidl, NULL);

IShellFolderPtr spRemoteFolder;
spDesktop->BinToObject(pidl, NULL, IID_IShellFolder, (void **)&spRemoteFolder);
spMalloc->Free(pidl);

IEnumIDListPtr spRemoteItems;
spRemoteFolder->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,, &spRemoteItems);

TCHAR strItemName[100];

while (spRemoteItems->Next(1, &pidl, NULL) == S_OK)
{
SHGetNameByFlag(spRemoteFolder, pidl, strItemName, 100, SHGDN_INFOLDER);
std::cout << strItemName << std::endl;
spMalloc->Free(pidl);
}
}

И вообще советую почитать MSDN о shell navigation. Огромные возможности, но и не менее огромные знания, которые предстоит постичь. Желаю удачи.

crack
28.12.2004, 12:57
огромное спасибо :)

Romeo
29.12.2004, 11:56
Тема перенесена из "C/C++" в "Win API, Shell". Тематика вынуждает :)