首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 7 開發:Shell Library 本機 API 實戰(中)

     編輯:關於.NET

任務 4:Delete / Rename 命令(C++ 版)

刪除使用 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。誤刪可從資源回收筒還原。

Restore deleted library from Recycle Bin

任務 5:SaveFolder / NavPanePinnedState / Icon 命令

SaveFolder

查詢時呼叫 GetDefaultSaveFolder(DSFT_DETECT) 取得 IShellItem2,再用 ResolveFolder 修正可能已變更的路徑,讀取 PKEY_ParsingPath。設定時用 SHCreateItemFromParsingName 建立項目再 SetDefaultSaveFolder,最後 Commit()。

NavPanePinnedState

透過 GetOptions/SetOptions 操作 LOF_PINNEDTONAVPANE 旗標(目前唯一可用選項)。

Icon

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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved