2.編譯並測試:
a.開啟一個命令列視窗,並且將目錄(cd)切換到SLUtil.exe所在的位置。
b.開啟緊鄰命令列視窗的庫Shell檔案夾,你將會看到你使用SLUtil工具所做的變 化.
c.在命令列視窗中,測試SLUtil命令。
d.試著為你的MyLib庫使用一個與Pictures庫相同的表徵圖。
e.試著將你的庫在檔案管理面板中鎖定和解鎖。
f.改變庫的預設儲存位置,將這個位置移到檔案系統中另外的位置,並且測試預設的存 儲位置是否解決了這個變化。
任務 6 –添加FolderType 命令
每個庫都有一個檔案夾模板類型。這個類型定義了Shell庫視窗的樣子和感覺,例如,圖 片和音樂就有不同的模板。IShellLibrary SetFolderType()方法則使用GUID的方式來表示 檔案夾的類型id。GetFolderType()方法則能返回當前檔案夾的id。預設情況,使用者建立的 庫,都是一般檔案夾類型。
為了讓使用者使用文本類型而不是使用GUID,我們需要使用一個協助類。 CfolderTypeIdNameConverter這個類知道如何將Pictures, Music, Documents, Videos, 和 Generic轉換成相應的FOLDERTYPEID_*,同樣,反之亦然。同時,這個方法還知道取名稱的 一部分,比如vid 就是 Videos。這些都將使設定庫檔案夾的類型變得簡單:SLUtil FolderType MyLib doc
1.向項目中添加FolderTypeIdNameConverter.h 和 FolderTypeIdNameConverter.cpp文 件。你可以從Starter檔案夾中找到它們。
2.添加 #include "FolderTypeIdNameConverter.h"
3.添加下面的程式碼片段,來實現FolderType命令:
C++ (SLUtil.cpp)
//Set or get the library's folder template
void FolderType(const CCommand &command, const vector<PCWSTR> &arguments)
{
IShellLibrary *shellLibrary = NULL;
HRESULT hr = S_OK;
FOLDERTYPEID folderTypeId;
CFolderTypeIdNameConverter converter;
//Show current folder type
if (arguments.size() == 1)
{
//Open library with read permissions
IShellLibrary *shellLibrary =
OpenLibrary(L"FolderType", arguments[0]);
hr = shellLibrary->GetFolderType(&folderTypeId);
if (FAILED (hr))
{
wcerr <<
L"FolderType: Can't get the library's folder template."
<< endl;
exit(5);
}
wcout << L"Library " << arguments[0] << L": Folder template is: " << converter.GetFolderTypeIdName(folderTypeId) << endl;
}
else //Set the current folder type
{
//Open library with read/write permissions
IShellLibrary *shellLibrary =
OpenLibrary(L"FolderType", arguments[0], false);
hr = converter.GetFolderTypeIdFromName(arguments[1],
&folderTypeId);
if (FAILED (hr))
{
wcerr << L"FolderType: Invalida folder template name." <<
endl;
exit(6);
}
hr = shellLibrary->SetFolderType(folderTypeId);
if (FAILED (hr))
{
wcerr <<
L"FolderType: Can't set the library's folder template,"
<< endl;
exit(7);
}
//Commit the library changes
shellLibrary ->Commit();
}
if (shellLibrary != NULL)
shellLibrary ->Release();
}
COMMAND(L"FolderType",
L"SLUtil FolderType LibraryName [Documents|Pictures|Music|Videos|Generic]",
L"Set or get the library's folder template", L"SLUtil MyLib Documents", 1,
FolderType);