3.編譯並測試結果:
a.清空命令列變數。
b.開啟一個命令列視窗,並且將目錄(cd)改變到SLUtil.exe檔案的所在位置(… \debug\SLUtil.exe)
c.開啟緊鄰命令列視窗的庫Shell檔案夾,你將會看到你使用SLUtil工具所做的變化。
d.在命令列中嘗試下面的SLUtil命令:
i.SLUtil ?
ii.SLUtil Create NewLibrary
iii.SLUtil AddFolder NewLibrary C:\Users
iv.SLUtil RemoveFolder NewLibrary C:\Users
注意 :
由於解譯器能夠找到最為匹配的命令,所以你可以使用“SLUtil Cr Lib”這種指令去創 建一個庫,或者使用“SLUtil Add Lib C:\”指令去添加一個檔案夾。嘗試一下。
任務 4 –添加刪除和重新命名命令
刪除和重新命名一個庫,是刪除或重新命名與其一致的*.library-ms檔案的庫的一系列操作 。要刪除一個檔案,我們可以使用SHFileOperation() 或 DeleteFile()。第一種方法可以 同時將庫清除,而且後續的操作更加簡單,所以我們將使用這個方法。如果要對檔案 進行重新命名,我們可以再次使用基於檔案系統的API,但是我們也可以使用拷貝庫的方式, 然後將原先的執行個體刪除掉。
1.向SLUtil.cpp檔案中添加下面的代碼:
C++ (SLUtil.cpp)
//Delete a library
void Delete(const CCommand &command, const vector<PCWSTR> &arguments)
{
PWSTR libraryFullPath;
HRESULT hr = GetLibraryFromLibrariesFolder(arguments[0], NULL, false,
&libraryFullPath);
if (FAILED(hr))
{
wcerr << L"Delete: Can't get library." << endl;
exit(4);
}
//We use delete file with the library file-system based full path
DeleteFile(libraryFullPath);
CoTaskMemFree(libraryFullPath);
}
COMMAND(L"Delete", L"SLUtil Delete LibraryName", L"Delete a library", L"SLUtil Delete MyLib", 1, Delete);
//Rename an existing library
void Rename(const CCommand &command, const vector<PCWSTR> &arguments)
{
IShellLibrary *shellLibrary = OpenLibrary (L"Rename", arguments[0]);
IShellItem *savedTo = NULL;
//Save a new copy of the library under the user's Libraries folder with
//the new name.
HRESULT hr = shellLibrary- >SaveInKnownFolder(FOLDERID_UsersLibraries,
arguments[1], LSF_MAKEUNIQUENAME, &savedTo);
if (FAILED(hr))
{
wcerr << L"Rename: Can't save library." << endl;
exit(5);
}
if (shellLibrary != NULL)
shellLibrary ->Release();
if (savedTo != NULL)
savedTo- >Release();
//Create parameters to delete the old copy of the library
vector<PCWSTR> deleteArguments;
deleteArguments.push_back(arguments [0]);
//Call the delete command
Delete(command, deleteArguments);
}
COMMAND(L"Rename", L"SLUtil Rename OldName NewName", L"Rename a library", L"SLUtil Rename MyLib MyLibNewName", 2, Rename);