刪除使用 DeleteFile 直接刪除 .library-ms 檔案。重命名透過 SaveInKnownFolder 另存新名稱至 Libraries Known Folder,再呼叫 Delete 刪除舊檔。
void Delete(const CCommand &cmd, const vector<PCWSTR> &args) {
PWSTR fullPath; GetLibraryFromLibrariesFolder(args[0], NULL, false, &fullPath);
DeleteFile(fullPath); CoTaskMemFree(fullPath);
}
COMMAND(L"Delete", L"SLUtil Delete LibraryName", L"Delete a library", L"SLUtil Delete MyLib", 1, Delete);
void Rename(const CCommand &cmd, const vector<PCWSTR> &args) {
IShellLibrary *lib = OpenLibrary(L"Rename", args[0]);
IShellItem *saved; lib->SaveInKnownFolder(FOLDERID_UsersLibraries, args[1], LSF_MAKEUNIQUENAME, &saved);
if (lib) lib->Release(); if (saved) saved->Release();
vector<PCWSTR> delArgs; delArgs.push_back(args[0]);
Delete(cmd, delArgs);
}
COMMAND(L"Rename", L"SLUtil Rename OldName NewName", L"Rename a library", L"SLUtil Rename MyLib MyLibNewName", 2, Rename);
驗證:SLUtil.exe rename mynewlibrary2 mynewlibrary4、SLUtil.exe del MyLib。誤刪可從資源回收筒還原。

查詢時呼叫 GetDefaultSaveFolder(DSFT_DETECT) 取得 IShellItem2,再用 ResolveFolder 修正可能已變更的路徑,讀取 PKEY_ParsingPath。設定時用 SHCreateItemFromParsingName 建立項目再 SetDefaultSaveFolder,最後 Commit()。
透過 GetOptions/SetOptions 操作 LOF_PINNEDTONAVPANE 旗標(目前唯一可用選項)。
GetIcon/SetIcon 直接讀寫圖示資源字串(如 imageres.dll,-1005),可為空。
// SaveFolder 完整實現
void SaveFolder(const CCommand &cmd, const vector<PCWSTR> &args) {
IShellLibrary *lib = NULL; IShellItem2 *item = NULL; HRESULT hr = S_OK;
if (args.size() == 1) {
lib = OpenLibrary(L"SaveFolder", args[0]);
hr = lib->GetDefaultSaveFolder(DSFT_DETECT, IID_PPV_ARGS(&item));
IShellItem2 *fixed = NULL;
lib->ResolveFolder(item, 5000, IID_PPV_ARGS(&fixed));
PWSTR path; fixed->GetString(PKEY_ParsingPath, &path);
wcout << L"Library " << args[0] << L" has folder " << path << L" as default save location." << endl;
fixed->Release(); CoTaskMemFree(path);
} else {
lib = OpenLibrary(L"SaveFolder", args[0], false);
SHCreateItemFromParsingName(args[1], 0, IID_PPV_ARGS(&item));
lib->SetDefaultSaveFolder(DSFT_DETECT, item);
lib->Commit();
}
if (item) item->Release(); if (lib) lib->Release();
}
COMMAND(L"SaveFolder", L"SLUtil SaveFolder LibraryName [FolderPath]", L"Set or get save folder", L"SLUtil SaveFolder Documents C:\\Docs", 1, SaveFolder);
// NavPanePinnedState
bool CompareStringShort(PCWSTR a, PCWSTR b) { ... } // 不區分大小寫比較前 min(len) 字元
void NavPanePinnedState(const CCommand &cmd, const vector<PCWSTR> &args) {
IShellLibrary *lib = NULL; HRESULT hr = S_OK;
if (args.size() == 1) {
lib = OpenLibrary(L"NavPanePinnedState", args[0]);
LIBRARYOPTIONFLAGS flags; lib->GetOptions(&flags);
wcout << L"Library " << args[0] << L" is" << ((flags & LOF_PINNEDTONAVPANE) ? L" " : L" not ") << L"pinned to navigation pane." << endl;
} else {
lib = OpenLibrary(L"NavPanePinnedState", args[0], false);
LIBRARYOPTIONFLAGS flags = CompareStringShort(args[1], L"TRUE") ? LOF_PINNEDTONAVPANE : LOF_DEFAULT;
lib->SetOptions(LOF_MASK_ALL, flags); lib->Commit();
}
if (lib) lib->Release();
}
COMMAND(L"NavPanePinnedState", L"SLUtil NavPanePinnedState LibraryName [TRUE|FALSE]", L"Set or get pinned state", L"SLUtil NavPanePinnedState MyLib TRUE", 1, NavPanePinnedState);
// Icon
void Icon(const CCommand &cmd, const vector<PCWSTR> &args) {
IShellLibrary *lib = NULL; HRESULT hr = S_OK;
if (args.size() == 1) {
lib = OpenLibrary(L"Icon", args[0]);
PWSTR icon; lib->GetIcon(&icon);
wcout << L"Library " << args[0] << L": Icon resource name: " << icon << endl;
CoTaskMemFree(icon);
} else {
lib = OpenLibrary(L"Icon", args[0], false);
lib->SetIcon(args[1]); lib->Commit();
}
if (lib) lib->Release();
}
COMMAND(L"Icon", L"SLUtil Icon LibraryName [Icon]", L"Set or get icon", L"SLUtil Icon MyLib imageres.dll,-1005", 1, Icon);