在Microsoft文档之后,调用SHGetDesktopFolder()函数应该返回文件系统根:
检索桌面文件夹的IShellFolder接口,该文件夹是名称空间的根。
所以我运行了以下代码:
void LogDesktopFolderContent()
{
IShellFolder* pDesktopFolder = nullptr;
// get the desktop folder
HRESULT hr = ::SHGetDesktopFolder(&pDesktopFolder);
if (FAILED(hr))
return;
IEnumIDList* pEnumIDList;
// list its content
hr = pDesktopFolder->EnumObjects(nullptr, SHCONTF_NONFOLDERS, &pEnumIDList);
if (FAILED(hr))
{
pDesktopFolder->Release();
return;
}
do
{
LPITEMIDLIST pItem;
hr = pEnumIDList->Next(1, &pItem, nullptr);
if (pItem)
{
wchar_t buffer[MAX_PATH + 1];
if (::SHGetPathFromIDListW(pItem, buffer))
{
::OutputDebugString(buffer);
::OutputDebugString(L"\r\n");
}
::CoTaskMemFree(pItem);
}
if (hr != S_OK)
break;
} while (1);
pDesktopFolder->Release();
}因此,我得到了以下文件:
用户C:\用户\管理桌面\私有C:\Users\Admin\Desktop\raw_registry_connections.png C:\ C:\Users\Admin\Desktop\StartSystem.bat \Admin\Desktop\Rad Studio公共Dir.lnk Dir.lnk C:\User\Admin\Desktop\ Alien Cube.url C:\User\Admin\桌面\折磨Souls.url C:\Users\Admin\Desktop\Notes.txt
这是我的桌面文件夹的内容。但是,这不是我的文件系统的根。
那么,我做错了什么,或者用Shell API获取文件系统根的正确方式是什么?
发布于 2022-08-12 10:31:16
这是根源。例如,c:\Windows\Notepad.exe位于shell命名空间中的(Desktop)\This PC\c:\Windows\Notepad.exe。
一个问题是,“这个PC”是一个文件夹,你要求非文件夹。另一个问题是,您正在调用SHGetPathFromIDListW,这只适用于具有文件系统路径的东西,而“此PC”则不起作用。要遍历命名空间,您应该只使用IShellFolder+pidl和/或IShellItem。要获取项目的“真实”名称,请打电话给IShellFolder::GetDisplayNameOf并请求SHGDN_FORPARSING。
https://stackoverflow.com/questions/73332300
复制相似问题