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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

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

Romeo » 29 дек 2004, 11:56

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

crack » 28 дек 2004, 12:57

огромное спасибо :)

Romeo » 28 дек 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 » 27 дек 2004, 23:28

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

Romeo » 27 дек 2004, 15:53

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

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

crack » 26 дек 2004, 16:24

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

Вернуться к началу