VC.NET扩展磁盘清理工具

分类: VC.NET   出处:iocblog整理  更新时间:2010-01-20   添加到收藏  

  摘 要

  介绍了windows磁盘清理工具二次开发的扩展接口,对其com接口加以分解,并运用atl库具体实现了清理“*.tmp”临时文件的功能。

  关键词 磁盘清理工具、atl库、com接口。

  引言

  windows磁盘清理工具(disk cleanup)是一个实用快捷并拥有简单易用界面的系统清理软件,更值得系统开发管理人员注意的是,此系统清理软件是建立在以com技术为基础发展的,支持第三方插件,并且可以根据需要自制定义功能二次开发的平台。在这里,我们对于windows磁盘清理工具的开发接口做深入地研究,在此基础上举例示范添加一个查找“*.tmp”临时文件的功能。

  技术讨论

  微软的com技术广泛地运用在windows的模块化设计中,致使支持二次开发。关于com技术基础与应用,可参考。在此,我们只为windows磁盘清理工具,简称清理工具的扩展接口加以分解。清理工具首次出现在windows 98操作系统中,并在后来推出的windows版本中予以改进,添加了新的功能。比如说,在ntfs的文件系统下,自动压缩不经常访问的文件。这些新功能通过com模块实现,在清理工具中作为插件调用。早期的版本是通过iemptyvolumecache接口调用,在windows 2000以后的版本中,还加入了iemptyvolumecache2接口,加入了较小的更新。

  iemptyvolumecache接口由五个函数组成,根据呼叫的顺序,分别是:

 

virtual /* [local] */ hresult stdmethodcalltype initialize(
/* [in] */ hkey hkregkey,
/* [in] */ lpcwstr pcwszvolume,
/* [out] */ lpwstr *ppwszdisplayname,
/* [out] */ lpwstr *ppwszdescription,
/* [out] */ dword *pdwflags) = 0;

virtual hresult stdmethodcalltype getspaceused(
/* [out] */ dwordlong *pdwlspaceused,
/* [in] */ iemptyvolumecachecallback *picb) = 0;

virtual hresult stdmethodcalltype showproperties(
/* [in] */ hwnd hwnd) = 0;

virtual hresult stdmethodcalltype purge(
/* [in] */ dwordlong dwlspacetofree,
/* [in] */ iemptyvolumecachecallback *picb) = 0;

virtual hresult stdmethodcalltype deactivate(
/* [out] */ dword *pdwflags) = 0;


  清理工具在正常执行时,首先调用initialize初始化插件,随后执行getspaceused来扫描可清除的文件大小。扫描完毕后,清理工具的主界面就出现了如图1所示,在此,我们加入了清理tmp文件的功能可以浏览不同的清理文件种类。列表中的每一个文件种类均由一个com插件实现。除了阅览可清理文件大小以外,用户在可以点击一个可自定义的按钮,调用插件的showproperties功能,以显示更详细的资料。如用户选择ok,清理工具就调用purge函数,清理扫描出来的文件。最后,deactivate函数被调用,终止插件的应用。

  运用于windows 2000以后的清理工具的插件也应该支持iemptyvolumecache的接口。iemptyvolumecache只由一个函数组成:

 

virtual /* [local] */ hresult stdmethodcalltype initializeex(

/* [in] */ hkey hkregkey,
/* [in] */ lpcwstr pcwszvolume,
/* [in] */ lpcwstr pcwszkeyname,
/* [out] */ lpwstr *ppwszdisplayname,
/* [out] */ lpwstr *ppwszdescription,
/* [out] */ lpwstr *ppwszbtntext,
/* [out] */ dword *pdwflags) = 0;


  initializeex增加了更严格的本地化语言要求,加强了国际化的支持,并且允许自定义按钮的显示文字。pdwflags变量用于在工具与插件间传递信息,支持下列旗标:

 [来源www.iocblog.net]

evcf_outofdiskspace
evcf_settingsmode
evcf_dontshowifzero
evcf_enablebydefault
evcf_enablebydefault_auto
evcf_hassettings
evcf_removefromlist


  evcf_outofdiskspace与evcf_settingsmode用于工具传递给插件的设定。evcf_outofdiskspace表示当前硬盘的空余空间非常有限,需要尽可能多地清理,即使是系统的性能会受到影响。evcf_settingsmode表示可定期执行的无人控制模式。在此模式下,getspaceused,purge,及showproperties都将不予调用,所有清理任务应予initializeex时执行。其它旗标用于插件传递给工具的不同运行模式。evcf_dontshowifzero表示在没有找到可删除文件时不显示此类型,evcf_enablebydefault表示此类型文件可以安全删除,evcf_enablebydefault_auto表示此类型文件可以非常安全的删除,evcf_hassettings表示此插件支持showproperties功能,可以显示详细信息。evcf_removefromlist表示是一次性清理任务,清理工具在执行后自动将插件关闭,以后不再执行。

 

 

  实现方法

  我们开发一个新的清理工具插件,扫描并清理*.TMP文件。COM的编程有多种方法,我们选择了ATL库。关于 ATL库的运用。

  我们在Visual Studio .net 2003中生成新的ATL的DLL Server项目,并使用Add Class加入新的ATL Simple Object控件类CCleanSimpleHandler。在定义中,我们让CCleanSimpleHandler从 IEmptyVolumeCache2继承。并且,我们添加了下列变量:

 

// 储存扫描出文件的大小

DWORDLONG m_dwlFileSize;

// 储存根目录

WCHAR m_strRootDir[MAX_PATH];

// 储存扫描出文件列表

std::vector m_lstFilesToDel;

  然后,我们一一实现 IEmptyVolumeCache及IEmptyVolumeCache2接口的函数。在下面的代码列表中,没有包括严格的检查错误返回值。这是为了简短代码的长度,提高可读性。在实际应用中,检查错误返回值是不可少的。为了不同版本Windows兼容,我们在InitializeEx中调用 Initialize。

HRESULT CCleanSimpleHandler::InitializeEx (HKEY hKey, LPCWSTR pcwszVolume, LPCWSTR pcwszKeyName, LPWSTR *ppwszDisplayName, LPWSTR *ppwszDescription, LPWSTR *ppwszBtnText, DWORD *pdwFlags)
{
  HRESULT hr = Initialize (hKey, pcwszVolume, ppwszDisplayName, ppwszDescription, pdwFlags);
 *ppwszBtnText = (LPWSTR) CoTaskMemAlloc (64 * sizeof (WCHAR));
 StrCpyW(*ppwszBtnText, L"View files");
  return hr;
}

HRESULT CCleanSimpleHandler::Initialize (HKEY hKey, LPCWSTR pcwszVolume, LPWSTR *ppwszDisplayName, LPWSTR *ppwszDescription, DWORD *pdwFlags)
{
 StrCpyW(m_strRootDir, pcwszVolume);
 *ppwszDisplayName = (LPWSTR) CoTaskMemAlloc(256 * sizeof (WCHAR));
 StrCpyW(*ppwszDisplayName, L"*.TMP files");
  *ppwszDescription = (LPWSTR) CoTaskMemAlloc (256 * sizeof (WCHAR));
  StrCpyW(*ppwszDescription, L"Temporary files - *.TMP");
 *pdwFlags = EVCF_HASSETTINGS | EVCF_ENABLEBYDEFAULT;
 m_dwlFileSize = 0;
  return S_OK;
}

  在GetSpaceUsed中,我们调用 ScanDir来扫描*.TMP文件,储存在m_lstFilesToDel中。GetSpaceUsed的第二个参数是 IEmptyVolumeCacheCallBack接口的指针,用于调用其ScanProgress函数以报告扫描的进展情况。 ScanProgress函数定义是:

HRESULT ScanProgress(DWORDLONG dwlSpaceUsed, DWORD dwFlags, LPCWSTR pwszReserved);

[1] [2] 下一页



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。