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. Огромные возможности, но и не менее огромные знания, которые предстоит постичь. Желаю удачи.
Ещё раз говорю, если удалённый компьютер фиксирован, то достаточно выполнить следующие манипуляции:
[code]
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);
}
}
[/code]
И вообще советую почитать MSDN о shell navigation. Огромные возможности, но и не менее огромные знания, которые предстоит постичь. Желаю удачи.