VC.NET扩展磁盘清理工具
摘 要
介绍了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 |
然后,我们一一实现 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);
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。