技术开发 频道

VS2010与Windows7共舞:对库进行编程

  利用非托管代码操作库

  对于非托管代码,我们可以利用Windows 7提供的Shell API操作库,对库进行管理。在本文中,我们假设开发的是一个常见的下载软件。在下载软件中,我们常常使用文件夹对各种下载的资源进行分类管理,例如:

 图2  下载软件的分类管理

  在下载软件中,这些资源都被组织在“All downloads”下,但是实际上这些下载资源可能被保存在硬盘的不同分区,不同目录下。为了便于利用Windows的资源管理器对所有下载资源进行访问,我们需要创建一个“MyDownload”库,让这个库跟下载软件的“All downloads”文件分类管理方式相对应,然后在这个库中管理我们所有下载的资源。

  为了演示Shell API对库的操作,我们创建一个简单的Visual C++控制台应用程序,在主函数中,我们创建库并对库进行操作:

 

#include "stdafx.h"

// 引入头文件

#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”库管理的文件,跟我们的下载软件所管理的文件一一对应,这样用户在浏览访问下载的文件时,有一种亲切感。

0
相关文章