{S0}简介
本文将介绍一种Windows外壳扩展,设计一个灵活和简便的方法来改变文件扩展名。使用此扩展,用户可以管理在一个单独的文件名和扩展。
默认情况下,资源管理器对用户隐藏的文件扩展名,这是确定",直到有而来的,是需要改变一个文件的扩展名。在Windows操作系统中,文件扩展名确定文件的类型和应用程序打开选定的文件,但有时我们发现一个不符合实际的文件内容与扩展的文件。最常见的例子之一是在类UNIX操作系统的文本文件。类UNIX系统通常使用换行符(0xAh),作为一个新的行分隔符,而不是Windows的回车换行字符对(0xDh 0xAh)。观看Windows的记事本,UNIX的*. txt文件通常显示为文本的BLOB没有适当的行结束符。对于庞大的文件,这使得文字难以阅读,并使得它几乎不可能正确的手工所有的行结束符。速战速决是在写字板中打开它,或重命名文件扩展名从*. txt的*. RTF。就个人而言,我用的是第二个选项。另一个例子是众所周知的漫画球迷:著名的*. CBZ只是压缩归档文件的扩展名改为*. ZIP为*. CBZ,图像文件。底线是,它是不是方便很多文件的扩展名手动更改。
这段代码的思想也从文件名起源是在Windows XP中处理。在Windows XP中,当一个文件被选中重命名,假设,是不是隐藏的扩展,选定两个文件名和扩展部分,用户必须强调只有扩展的一部分改变它。而且,它仅适用于一个单一的文件。在Vista中,当这两个部分是可见的,默认情况下名称的一部分突出。"守则"
{A}的文章,引发了这个代码的灵感之一,因此建议先读它,因为这篇文章是建立在它的上面。
此代码是编译时使用的Visual C 2005 Express版本,平台SDK 2003 R2 WTL的8.0和ResEdit的,所以任何人都应该能够建立项目。
由于这是一个外壳扩展,代码使用一个简单的异常处理,以防止任何意外的事件,Windows资源管理器崩溃。通过Win32 SHFileOperation函数进行重命名,文件操作一次,使Explorer可以提供一个quot; Undoquot;每一个处理文件的每一步。为了使在资源管理器"; Undoquot;行动,fFlags成员设置FOF_ALLOWUNDO。要正确格式SHFILEOPSTRUCT,一个额外的终止空'\ 0'必须被添加到文件名缓冲区的结束。 SHFILEOPSTRUCT lpFileOp;
memset(&lpFileOp,0,sizeof(lpFileOp));
lpFileOp.hwnd=NULL;
lpFileOp.fFlags=FOF_ALLOWUNDO;
lpFileOp.wFunc=FO_RENAME;
fname+='\0';//add buffer-terminating null to old name
lpFileOp.pFrom=fname;
toname=splitter.drive+splitter.dir+splitter.filename+_T(".")+newext;
lpFileOp.pTo=toname;
if (0!=SHFileOperation(&lpFileOp)) {/*MSGBOX0("SHFileOperation failed");
*/return false;}
使用SHFileOperation的后果,企图改变目标解决路径的延伸的一条捷径结果,和重命名操作目标。另一个奇怪的是,在这种情况下,对话是不尊重Explorer的所有者窗口模式。
默认情况下,右键单击第一个文件的文件扩展名是作为一个新的扩展选择。扩展显示在大写的外壳菜单项,但是,实际字符串的情况下为用户决定离开,因为有一些方案,用户可以选择保存文件时(如MP3和一个大写和小写的扩展之间MP3)。
新扩展检查无效字符,默认的Windows浏览器的行为是模拟:
如果您没有看到任何气球提示,下查找注册表项HKEY_CURRENT_USER \ SOFTWARE \ MICROSOFT \ WINDOWS \ \ Explorer中\高级设置DWORD值为EnableBalloonTips为1,使全系统的气球提示。
在外壳上下文菜单的菜单项的位置完全取决于*. rgs文件的字符串值的字母顺序。这个外壳扩展,项目的CLSID(A5096FA1 - 32DC - 4392 - A829 - 445558F0F4B5)用于定位的菜单项的外壳上下文菜单中的某个地方:
{S2}
如果在右边的字符串值,例如,AAAAAAAAAA_go_to_the_top__,菜单项将被定位在外壳上下文菜单的顶部:{C}
,您还需要相匹配的*. rgs文件的CLSID进入:
GUI布局和XP风格的认识NoRemove CLSID
{
ForceRemove { AAAAAAAAAA_go_to_the_top__} = s 'ChangeExtMenuExt Class'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
}
}
菜单项有一个易于现场插入菜单点阵图,提供快速的视觉地标。
{S3}
这个外壳扩展的另一个重要问题,因为它是基于对话框,使视觉上的一致性的WinXP主题。为了有一个对话框,启用了XP主题,有必要在stdafx.h中#包括前设置以下值:#define VC_EXTRALEAN //necessary
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x501
#endif
#define _ATL_APARTMENT_THREADED
#define ISOLATION_AWARE_ENABLED 1 //XP style awareness
这些快照展示了在外观上的差异:主题知道:主题意识:{S4}的{五}
XP主题意识主题是进一步讨论在MSDN上的文章。
提供了一些很好的和交互式的图形用户界面,而不是一个quot用户; Helpquot;按钮,我用。
当心! ??如果你不把任何HTML帮助文件(*. CHM)在调试版本DLL的目录(其中hlppath变量指向),你会得到一个讨厌的资源管理器崩溃的CBitmapHyperlink的ASSERTS之一。在发行版中不会发生这种情况。
,而不是一个quot; Aboutquot;按钮,我决定把一个很好的可点击的图标。我把它作为一个读者的excercise实行业主绘制更看中按钮。推荐阅读
由恐龙埃斯波西托(MSDN,网址可能会改变)。这些错误和问题
请报告您在这篇文章的留言板中找到的任何问题和错误。| T800G