外壳如何确定程序是否支持长文件名的

外壳如何确定程序是否支持长文件名的

作者:BlogUpdater |  时间:2021-12-03 |  浏览:513 |  评论已关闭 条评论

当你注册你开发的程序为文件拓展处理程序时,外壳需要判断你的程序是否支持长文件名,这样它就可以决定向你的程序传递长文件名(路径中可能包含空格,所以在注册脚本中请为文件路径添加上双引号,例如”%1″)还是短文件名。

规则很简单:外壳会检查你的程序的的PE头部,来判定程序的类别。
> 如果它是一个16位的程序,则外壳会这样假设:如果程序被标记为”兼容Windows95″,则它认为程序支持长文件名,否则不支持。
> 如果它是一个32位的程序(或者是一个64位系统上的64位程序),则外壳会假定程序支持长文件名。
> 如果外壳找不到程序可执行文件,则外壳会采取保守的处理方式,认为该程序不支持长文件名。

请注意上面的第三种情况。如果在程序注册阶段出了问题,则外壳就无法判断程序是否支持长文件名,并假定它不支持。然后当你的程序需要在标题栏上显示文件名时,就会出现一些”黏糊糊”的短文件名,而不是预期中的长文件名。

注册程序过程中最容易出现的问题是开发者会忘记将他们的可执行文件路径添加上双引号。例如,一个错误的注册表结构看起来像下图这样:

请注意上图中的路径并没有使用双引号。这个时候,外壳会错误的解析此路径,并认为可执行程序为”C:\Program”,很显然这个文件并不存在,最终外壳认为这个程序不支持长文件名。

兼容性提示:作为其他安全工作的一部分,外壳中解析这些命令行的代码得到了优化,以追踪程序的”预期”路径。 这提供了修复第三种情况的机会,以便外壳最终可以找到程序,并判断它支持长文件名,从而避免用户看到他们美妙的长文件名变成一堆波浪号的短文件名。

在我们做了这样的优化之后,我们又不得不将其删除。何故?兼容性是也。

因为有些程序不仅错误地注册了自己,而且依赖于不够聪明的外壳来找到它们的真实位置,导致程序在命令行上接收到短文件名。事实证明,这些程序想要的就是短文件名,而进行这种伪造是他们实现它的方式。

再一次的,有些人已经开始大喊了:”放弃这个兼容性不香吗?”
是的,挺香的,只要这个不兼容的东西不是你使用的东西,这一切都很好。 但如果这是你的程序,或者你的公司依赖的程序,我想你会改变你的想法。

总结
是时候抛掉包袱,轻装上阵了老大哥。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How does Explorer detect whether your program supports long file names?》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。