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

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

     編輯:關於.NET

任務 6:FolderType 命令

每個庫擁有資料夾模板類型(Generic/Documents/Pictures/Music/Videos),決定總管顯示樣式。原生 API 使用 GUID(FOLDERTYPEID_*),引入 CFolderTypeIdNameConverter 輔助類在名稱與 GUID 間轉換。

C++ 實現

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);

任務 7:ListFolders 命令

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);

任務 8:ManageUI 命令

呼叫 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);

Shell Library Management Dialog

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved