Windows 7編程新特性Shell Library接口介紹
Windows 7的上線日期日益臨近,關(guān)于Windows 7編程新特性的文章頁開始出現(xiàn),目前看來很多Windows 7編程新特性都是圍繞.NET平臺(tái)進(jìn)行的,畢竟都是微軟一家的東西。
下文所用到的示例代碼來源于微軟一站式開發(fā)技術(shù)框架解決方案。你可以通過http://cfx.codeplex.com/Release/ProjectReleases.aspx下載到Windows 7 Shell Library相關(guān)的sample。其中包含C++、C#、VB.NET對(duì)Shell Library操作的示例代碼:CppWin7ShellLibrary, C#Win7ShellLibrary, VBWin7ShellLibrary。
為了幫助用戶更加有效地對(duì)硬盤上的文件進(jìn)行管理,Windows 7中引入了新的文件管理方式:庫(Library)。庫自然演化自以往操作系統(tǒng)中My Documents 文件夾這個(gè)概念。有了庫,我們就可以將多個(gè)相關(guān)的文件夾組織到同一個(gè)庫下,從而更快更便捷地管理和搜索數(shù)據(jù)。
創(chuàng)建Windows Shell Library
Windows 7提供了SHCreateLibrary API用來創(chuàng)建一個(gè)Shell Library:
- C++ CreateShellLibrary
- /**//*!
- * Create a new shell library under the user's Libraries folder. If a library
- * with the same name already exists, the new one overrides the existing one.
- *
- * \param pwszLibraryName
- * The name of the shell library to be created.
- */
- BOOL CreateShellLibrary(LPWSTR pwszLibraryName)
- {
- /**//////////////////////////////////////////////////////////////////////////
- // Create the shell library COM object.
- //
- IShellLibrary* pShellLib = NULL;
- HRESULT hr = SHCreateLibrary(IID_PPV_ARGS(&pShellLib));
- if (FAILED(hr))
- {
- _tprintf(_T("SHCreateLibrary failed to create the shell library ") \
- _T("COM object w/err 0x%08lx\n"), hr);
- return FALSE;
- }
- /**/////////////////////////////////////////////////////////////////////////
- // Save the new library under the user's Libraries folder.
- //
- IShellItem* pSavedTo = NULL;
- hr = pShellLib->SaveInKnownFolder(FOLDERID_UsersLibraries,
- pwszLibraryName, LSF_OVERRIDEEXISTING, &pSavedTo);
- if (FAILED(hr))
- {
- _tprintf(_T("IShellLibrary::SaveInKnownFolder failed to save the ") \
- _T("library w/err 0x%08lx\n"), hr);
- return FALSE;
- }
- /**//////////////////////////////////////////////////////////////////////////
- // Clean up.
- //
- if (pShellLib != NULL)
- pShellLib->Release();
- if (pSavedTo != NULL)
- pSavedTo->Release();
- return TRUE;
- }
- /**//////////////////////////////////////////////////////////////////////
- // Create a shell library.
- //
- using (ShellLibrary library = new ShellLibrary(libraryName, true))
- {
- }
管理Windows Shell Library
你可以通過調(diào)用SHShowManageLibraryUI API顯示出Windows 標(biāo)準(zhǔn)的Shell Library管理對(duì)話框。值得注意的是,在調(diào)用SHShowManageLibraryUI前請(qǐng)確保 shell library沒有被以可寫方式打開。否則在SHShowManageLibraryUI中對(duì)shell library的修改將無法被保存。
C++ ShowManageLibraryUI
- C++ ShowManageLibraryUI
- /**//*!
- * Shows the library management dialog box of the specified library, which
- * enables users to manage the library folders and default save location.
- *
- * \param pwszLibraryName
- * The name of the shell library
- */
- BOOL ShowManageLibraryUI(LPWSTR pwszLibraryName)
- {
- // Get the shell item that represents the library.
- IShellItem2* pShellItem = GetShellLibraryItem(pwszLibraryName);
- HRESULT hr = SHShowManageLibraryUI(pShellItem, NULL,
- L"CppWin7ShellLibrary", L"Manage Library folders and settings",
- LMD_ALLOWUNINDEXABLENETWORKLOCATIONS);
- // Clean up
- if (pShellItem != NULL)
- pShellItem->Release();
- return SUCCEEDED(hr);
- }
- C# ShowManageLibraryUI
- // ShowManageLibraryUI requires that the library is not currently
- // opened with write permission.
- ShellLibrary.ShowManageLibraryUI(libraryName, IntPtr.Zero,
- "CSWin7ShellLibrary", "Manage Library folders and settings", true);
向Shell Library中添加文件夾
SHAddFolderPathToLibrary可用來向指定的Shell Library中添加文件夾。
- C++ AddFolderToShellLibrary
- /**//*!
- * Add a folder to an existing shell library.
- *
- * \param pShellLib
- * The IShellLibrary interface of the shell library
- *
- * \param pwszFolderPath
- * The path of the folder to be added into the shell library
- *
- * \param bSaveLocation
- * If bSaveLocation is TRUE, set the folder as the save location of the shell
- * library
- */
- BOOL AddFolderToShellLibrary(IShellLibrary* pShellLib,
- LPWSTR pwszFolderPath, BOOL bSaveLocation)
- {
- HRESULT hr = SHAddFolderPathToLibrary(pShellLib, pwszFolderPath);
- if (FAILED(hr))
- {
- _tprintf(_T("SHAddFolderPathToLibrary failed to add a folder ") \
- _T("to the shell library w/err 0x%08lx\n"), hr);
- return FALSE;
- }
- // Save the folder as the save location of the shell library
- if (bSaveLocation)
- {
- // Create shell item from folder path
- IShellItem2* pShellItemSaveFolder = NULL;
- hr = SHCreateItemFromParsingName(pwszFolderPath, 0,
- IID_PPV_ARGS(&pShellItemSaveFolder));
- if (FAILED(hr))
- {
- _tprintf(_T("SHCreateItemFromParsingName failed w/err ") \
- _T("0x%08lx\n"), hr);
- return FALSE;
- }
- // Set the folder as the save location
- pShellLib->SetDefaultSaveFolder(DSFT_DETECT, pShellItemSaveFolder);
- if (pShellItemSaveFolder != NULL)
- pShellItemSaveFolder->Release();
- if (FAILED(hr))
- {
- _tprintf(_T("IShellLibrary::SetDefaultSaveFolder failed ") \
- _T("w/err 0x%08lx\n"), hr);
- return FALSE;
- }
- }
- // Commit the change of the shell library
- pShellLib->Commit();
- return TRUE;
- }
- C# AddFolderToShellLibrary
- using (ShellLibrary library = ShellLibrary.Load(libraryName, false))
- {
- /**//////////////////////////////////////////////////////////////////
- // Add a folder to the shell library.
- //
- // Add the folder to the shell library
- library.Add(folderPath);
- library.DefaultSaveFolder = folderPath;
- }
枚舉Shell Library中的文件夾
IShellLibrary::GetFolders可用來得到Shell Library中的文件夾。
- C++ ListFoldersInShellLibrary
- /**//*!
- * List all folders in the shell library.
- *
- * \param pShellLib
- * The IShellLibrary interface of the shell library
- */
- void ListFoldersInShellLibrary(IShellLibrary* pShellLib)
- {
- HRESULT hr = S_OK;
- IShellItemArray* pShellItemArray = NULL;
- pShellLib->GetFolders(LFF_ALLITEMS, IID_PPV_ARGS(&pShellItemArray));
- if (FAILED(hr))
- {
- _tprintf(_T("IShellLibrary::GetFolders failed to get the folders ") \
- _T("of the shell library w/err 0x%08lx\n"), hr);
- return;
- }
- DWORD dwFolderCount;
- pShellItemArray->GetCount(&dwFolderCount);
- // Iterate through all folders of the shell library
- for (DWORD i = 0; i < dwFolderCount; i++)
- {
- IShellItem *pShellItem;
- hr = pShellItemArray->GetItemAt(i, &pShellItem);
- if (FAILED(hr))
- continue;
- // Convert IShellItem to IShellItem2
- IShellItem2 *pShellItem2;
- pShellItem->QueryInterface(IID_PPV_ARGS(&pShellItem2));
- pShellItem->Release();
- // Fix folder path changes
- IShellItem2 *pShellItemResolvedFolder = NULL;
- hr = pShellLib->ResolveFolder(pShellItem2, 5000, IID_PPV_ARGS(
- &pShellItemResolvedFolder));
- if (SUCCEEDED(hr))
- {
- // Point to the fixed folder
- pShellItem2->Release();
- pShellItem2 = pShellItemResolvedFolder;
- }
- // Else we will show the unfixed folder
- // Print the folder path
- LPWSTR wszFolderPath;
- hr = pShellItem2->GetString(PKEY_ParsingPath, &wszFolderPath);
- if (SUCCEEDED(hr))
- {
- _putws(wszFolderPath);
- }
- CoTaskMemFree(wszFolderPath);
- // Clean up
- pShellItem2->Release();
- }
- pShellItemArray->Release();
- }
- C# ListFoldersInShellLibrary
- using (ShellLibrary library = ShellLibrary.Load(libraryName, false))
- {
- /**//////////////////////////////////////////////////////////////////
- // List all folders in the library.
- //
- foreach (ShellFolder folder in library)
- {
- Console.WriteLine(folder);
- }
- }
刪除一個(gè)Shell Library
- C++ DeleteShellLibrary
- /**//*!
- * Delete the shell library under the user's Libraries folder according to the
- * specified library name.
- *
- * \param pwszLibraryName
- * The name of the shell library to be deleted.
- */
- BOOL DeleteShellLibrary(LPWSTR pwszLibraryName)
- {
- /**//////////////////////////////////////////////////////////////////////////
- // Get the shell item that represents the library and its full path.
- //
- IShellItem2* pShellItem = GetShellLibraryItem(pwszLibraryName);
- // Get the file-system full path of the shell item
- LPWSTR wszLibraryFullPath;
- pShellItem->GetString(PKEY_ParsingPath, &wszLibraryFullPath);
- /**//////////////////////////////////////////////////////////////////////////
- // Delete file with the library file-system based full path.
- //
- BOOL bSuccess = DeleteFileW(wszLibraryFullPath);
- // Clean up
- CoTaskMemFree(wszLibraryFullPath);
- if (pShellItem != NULL)
- pShellItem->Release();
- return bSuccess;
- }
- C# DeleteShellLibrary
- /**//////////////////////////////////////////////////////////////////////
- // Delete the shell library.
- //
- string librariesPath = Path.Combine(Environment.GetFolderPath(
- Environment.SpecialFolder.ApplicationData),
- ShellLibrary.LibrariesKnownFolder.RelativePath);
- string libraryPath = Path.Combine(librariesPath, libraryName);
- string libraryFullPath = Path.ChangeExtension(libraryPath, "library-ms");
- File.Delete(libraryFullPath);
Windows 7編程新特性Shell Library接口介紹就到這里吧。
原文標(biāo)題:Windows 7 新特性 Shell Library 編程接口介紹
鏈接:http://www.cnblogs.com/Jialiang/archive/2009/09/04/Win7ShellLibrary.html
【編輯推薦】