图3,新创建的自定义库
当然,库的创建只是最基本的操作。当我们完成对库的创建后,我们可以利用Shell API继续对库进行各种操作,比如设置库的图标,类型,设置库默认的保存路径,枚举库中的所有文件夹等。
#include "stdafx.h"
//
#include <shobjidl.h>
#include <objbase.h> // IID_PPV_ARGS macro
#include <Knownfolders.h> //
#include <Shlguid.h.>
int _tmain(int argc, _TCHAR* argv[])
{
//
CoInitialize(NULL);
// 创建库
//对库进行操作
IShellLibrary *pslLibrary;
// 加载已经存在的库,并对其进行管理
HRESULT hr = SHLoadLibraryFromParsingName(L"C:\\Users\\Win7\\
AppData\\Roaming\\Microsoft\\Windows\\Libraries\\
MyDownload.library-ms",
STGM_READWRITE, IID_PPV_ARGS(&pslLibrary));
if(SUCCEEDED(hr))
{
// 设置库的图标
hr = pslLibrary->SetIcon(L"C:\\Windows\\System32\\SHELL32.dll,-14");
// 设置库的类型
hr = pslLibrary->SetFolderType(FOLDERTYPEID_GenericLibrary);
// 循环遍历库中的所有文件夹
IShellItemArray *psiaFolders;
hr = pslLibrary->GetFolders(LFF_STORAGEITEMS,
IID_PPV_ARGS(&psiaFolders));
IEnumShellItems *penumShellItems;
psiaFolders->EnumItems(&penumShellItems);
DWORD dwCount = 0;
psiaFolders->GetCount(&dwCount);
IShellItem *psiFolder;
// 循环遍历库所管理的所有文件夹
for(DWORD dwIndex = 0; dwIndex < dwCount; ++dwIndex )
{
// 获得文件夹
psiaFolders->GetItemAt(dwIndex, &psiFolder );
WCHAR strFolderName[256] = L"";
LPWSTR *pName = (LPWSTR*)strFolderName;
// 获得文件夹的名字
hr = psiFolder->GetDisplayName(SIGDN_NORMALDISPLAY,
(LPWSTR*)pName);
if(SUCCEEDED(hr))
{
// 将文件夹的名字与“Tools”进行比较
// 也就是找到名为“Tools”的文件夹
if(wcscmp( *pName, L"Tools") == 0)
{
// 如果找到“Tools”文件夹,将其设置
// 为库的默认保存文件夹
hr = pslLibrary- >SetDefaultSaveFolder(
DSFT_PRIVATE,
psiFolder);
}
}
}
// 提交对库的修改
pslLibrary->Commit();
pslLibrary->Release();
}
}
//
::CoUninitialize();
return 0;
}
//
#include <shobjidl.h>
#include <objbase.h> // IID_PPV_ARGS macro
#include <Knownfolders.h> //
#include <Shlguid.h.>
int _tmain(int argc, _TCHAR* argv[])
{
//
CoInitialize(NULL);
// 创建库
//对库进行操作
IShellLibrary *pslLibrary;
// 加载已经存在的库,并对其进行管理
HRESULT hr = SHLoadLibraryFromParsingName(L"C:\\Users\\Win7\\
AppData\\Roaming\\Microsoft\\Windows\\Libraries\\
MyDownload.library-ms",
STGM_READWRITE, IID_PPV_ARGS(&pslLibrary));
if(SUCCEEDED(hr))
{
// 设置库的图标
hr = pslLibrary->SetIcon(L"C:\\Windows\\System32\\SHELL32.dll,-14");
// 设置库的类型
hr = pslLibrary->SetFolderType(FOLDERTYPEID_GenericLibrary);
// 循环遍历库中的所有文件夹
IShellItemArray *psiaFolders;
hr = pslLibrary->GetFolders(LFF_STORAGEITEMS,
IID_PPV_ARGS(&psiaFolders));
IEnumShellItems *penumShellItems;
psiaFolders->EnumItems(&penumShellItems);
DWORD dwCount = 0;
psiaFolders->GetCount(&dwCount);
IShellItem *psiFolder;
// 循环遍历库所管理的所有文件夹
for(DWORD dwIndex = 0; dwIndex < dwCount; ++dwIndex )
{
// 获得文件夹
psiaFolders->GetItemAt(dwIndex, &psiFolder );
WCHAR strFolderName[256] = L"";
LPWSTR *pName = (LPWSTR*)strFolderName;
// 获得文件夹的名字
hr = psiFolder->GetDisplayName(SIGDN_NORMALDISPLAY,
(LPWSTR*)pName);
if(SUCCEEDED(hr))
{
// 将文件夹的名字与“Tools”进行比较
// 也就是找到名为“Tools”的文件夹
if(wcscmp( *pName, L"Tools") == 0)
{
// 如果找到“Tools”文件夹,将其设置
// 为库的默认保存文件夹
hr = pslLibrary- >SetDefaultSaveFolder(
DSFT_PRIVATE,
psiFolder);
}
}
}
// 提交对库的修改
pslLibrary->Commit();
pslLibrary->Release();
}
}
//
::CoUninitialize();
return 0;
}
在这段代码中,我们首先利用SHLoadLibraryFromParsingName函数,从一个库定义文件中加载这个库并创建一个IShellLibrary对象,然后,我们就可以利用IShellLibrary对象提供的各种操作函数对库进行操作。在这里,我们首先利用SetIcon函数修改了库的图标,SetIcon函数接受一个字符串作为参数,指定库所使用的图标所在的资源 DLL名称和图标索引。然后,我们利用SetFolderType函数修改库的类型,SetFolderType函数可以接受已知文件夹的类型模板的 GUID作为输入参数,而这个 GUID所代表的文件夹模板定义了这个库可以是下列之一的类型:通用类型,图片,音乐,视频和文档等。 设置库的类型,可以更改库的 Windows 资源管理器视图,并启用搜索和专为库类型设计的视图选项。接下来,我们循环遍历库管理的所有文件夹,找到名为“Tools”的文件夹并将其设置为库的默认保存文件夹。默认情况下,当我们在通用文件保存对话框中选择一个库作为保存位置时,系统会使用库的第一个文件夹作为其保存的文件夹,通过修改库的默认文件夹,我们可以重定向库的默认保存位置。最后,我们调用Commit函数提交对库的修改,也就是将这些修改写入的库定义文件中,从而完成对库的操作。