每個庫擁有資料夾模板類型(Generic/Documents/Pictures/Music/Videos),決定總管顯示樣式。原生 API 使用 GUID(FOLDERTYPEID_*),引入 CFolderTypeIdNameConverter 輔助類在名稱與 GUID 間轉換。
void FolderType(const CCommand &cmd, const vector<PCWSTR> &args) {
IShellLibrary *lib = NULL; HRESULT hr = S_OK; FOLDERTYPEID ftid;
CFolderTypeIdNameConverter converter;
if (args.size() == 1) { // 查詢
lib = OpenLibrary(L"FolderType", args[0]);
hr = lib->GetFolderType(&ftid);
if (FAILED(hr)) { wcerr << L"FolderType: Can't get folder template." << endl; exit(5); }
wcout << L"Library " << args[0] << L": Folder template is: " << converter.GetFolderTypeIdName(ftid) << endl;
} else { // 設定
lib = OpenLibrary(L"FolderType", args[0], false);
hr = converter.GetFolderTypeIdFromName(args[1], &ftid);
if (FAILED(hr)) { wcerr << L"FolderType: Invalid folder template name." << endl; exit(6); }
hr = lib->SetFolderType(ftid);
if (FAILED(hr)) { wcerr << L"FolderType: Can't set folder template." << endl; exit(7); }
lib->Commit();
}
if (lib) lib->Release();
}
COMMAND(L"FolderType", L"SLUtil FolderType LibraryName [Documents|Pictures|Music|Videos|Generic]", L"Set or get folder template", L"SLUtil MyLib Documents", 1, FolderType);
GetFolders() 回傳 IShellItemArray,迭代取得 IShellItem2,用 ResolveFolder() 修正已重命名/移動/刪除的資料夾路徑,最後讀取 PKEY_ParsingPath。
void ListFolders(const CCommand &cmd, const vector<PCWSTR> &args) {
IShellLibrary *lib = OpenLibrary(L"ListFolders", args[0]);
IShellItemArray *arr = NULL;
lib->GetFolders(LFF_ALLITEMS, IID_PPV_ARGS(&arr));
DWORD cnt; arr->GetCount(&cnt);
wcout << L"Folder list of " << args[0] << L" library:" << endl;
for (DWORD i=0; i<cnt; ++i) {
IShellItem *item; IShellItem2 *item2;
arr->GetItemAt(i, &item);
item->QueryInterface(IID_PPV_ARGS(&item2)); item->Release();
IShellItem2 *fixedItem = NULL;
lib->ResolveFolder(item2, 5000, IID_PPV_ARGS(&fixedItem));
if (SUCCEEDED(hr)) { item2->Release(); item2 = fixedItem; }
PWSTR path; item2->GetString(PKEY_ParsingPath, &path);
if (SUCCEEDED(hr)) wcout << path << endl;
CoTaskMemFree(path); item2->Release();
}
arr->Release(); lib->Release();
}
COMMAND(L"ListFolders", L"SLUtil ListFolders LibraryName", L"List all library folders", L"SLUtil ListFolders Documents", 1, ListFolders);
呼叫 SHShowManageLibraryUI 顯示原生管理對話框,傳入 IShellItem、父視窗、標題、說明、允許不可索引網路位置旗標。
void ManageUI(const CCommand &cmd, const vector<PCWSTR> &args) {
PWSTR fullPath; GetLibraryFromLibrariesFolder(args[0], NULL, false, &fullPath);
IShellItem *item; SHCreateItemFromParsingName(fullPath, 0, IID_PPV_ARGS(&item));
PCWSTR title = args[0], instr = L"Manage Library folders and settings";
if (args.size() > 1) title = args[1];
if (args.size() > 2) instr = args[2];
SHShowManageLibraryUI(item, NULL, title, instr, LMD_ALLOWUNINDEXABLENETWORKLOCATIONS);
item->Release(); CoTaskMemFree(fullPath);
}
COMMAND(L"ManageUI", L"SLUtil ManageUI LibraryName [Title] [Instruction]", L"Show management UI", L"SLUtil ManageUI Documents", 1, ManageUI);

測試:SLUtil ManageUI Pictures "Manage Picture Library" "Add or Remove folders from the Pictures Library"