利用非托管代码操作库
对于非托管代码,我们可以利用Windows 7提供的Shell API操作库,对库进行管理。在本文中,我们假设开发的是一个常见的下载软件。在下载软件中,我们常常使用文件夹对各种下载的资源进行分类管理,例如:
图2 下载软件的分类管理
在下载软件中,这些资源都被组织在“All downloads”下,但是实际上这些下载资源可能被保存在硬盘的不同分区,不同目录下。为了便于利用Windows的资源管理器对所有下载资源进行访问,我们需要创建一个“MyDownload”库,让这个库跟下载软件的“All downloads”文件分类管理方式相对应,然后在这个库中管理我们所有下载的资源。
为了演示Shell API对库的操作,我们创建一个简单的Visual C++控制台应用程序,在主函数中,我们创建库并对库进行操作:
// 引入头文件
#include <shobjidl.h> // 引入Shell API
#include <objbase.h> // 定义 IID_PPV_ARGS宏
#include <Knownfolders.h> // 引入FOLDERID
int _tmain(int argc, _TCHAR* argv[])
{
// 初始化COM
CoInitialize(NULL);
// 利用Shell API创建库
IShellLibrary *pIShelLibrary;
HRESULT hr = SHCreateLibrary(IID_PPV_ARGS(&pIShelLibrary));
if (SUCCEEDED(hr))
{
// 如果库创建成功,添加不同的文件路径到当前库中
IShellItem *pIShellItem;
SHAddFolderPathToLibrary(pIShelLibrary,
L"C:\\Users\\Public\\Pictures");
SHAddFolderPathToLibrary(pIShelLibrary,
L"C:\\Users\\Public\\Music");
SHAddFolderPathToLibrary(pIShelLibrary,
L"D:\\Tools");
SHAddFolderPathToLibrary(pIShelLibrary,
L"D:\\Video");
// 将当前库保存到系统的库目录下
// 也就是添加一个新的库“MyDownload”
hr = pIShelLibrary->SaveInKnownFolder(FOLDERID_Libraries ,
L"MyDownload",
LSF_MAKEUNIQUENAME,
&pIShellItem);
// 释放对象
pIShellItem->Release();
pIShelLibrary->Release();
}
// 释放COM
::CoUninitialize();
return 0;
}
在这段代码中,我们首先引入了使用Shell API所需要的头文件。然后在主函数中,因为这些API都是基于COM的,所以我们首先需要进行COM环境的初始化,完成COM环境的初始化后,我们就可以利用Shell API进行各种库的操作了。这里,我们使用SHCreateLibrary函数创建了一个新的库对象,然后利用SHAddFolderPathToLibrary函数将硬盘上的各个路径添加到这个库中,也就是利用这个库对这些路径下的文件进行管理。然后,我们将这个新创建的库保存到FOLDERID_Libraries下,也就是在这个目录下创建一个新的库定义文件。最后,我们还需要进行必要的COM对象释放工作。通过这样的步骤,我们就可以在文件浏览器中看到我们新创建的库了。现在,这个“MyDownload”库管理的文件,跟我们的下载软件所管理的文件一一对应,这样用户在浏览访问下载的文件时,有一种亲切感。