ight:450px;width:100%;">
有很多函数返回被称为“显示名称(display names)”的字符串。对于这些显示名称你可以做的唯一一件事就是拿来显示。不要假设这些字符串有任何实际的意义,因为它们的确没有意义。
理论上,一个类似于SHGetFileInfo这样的函数可以被实现成:
你的程序应当仍然可以正常运行。
(当然,这不过是一个基本准则。一些特定的函数可能会有例外。如带SHGDN_FORPARSING标志的IShellFolder::GetDisplayNameOf调用,这将显式的指出返回的字符串被设计用于程序解析用途。)
“显示名称”的用途是作为一个适于显示给用户的字符串。比如文件的显示名称可能是文件名,也可能是去掉后缀,更甚至于可能被翻译成用户首选的语言!举例来说,在一个安装并激活了德文语言包的英文系统上,试图获取C:/Documents and Settings/Raymond/My Documents的显示名称,将会得到Eigene Dateien,因为这是德语中My Documents的名称。
如果你的程序假设C:/Documents and Settings/Raymond/My Documents的显示名称大约是“My Documents”的样子,当它被我运行时将会遇到很大的意外。
我的一名同事曾去查找一个程序不能运行的BUG。尽管CD-ROM就在驱动器中,这个程序仍然抱怨找不到CD-ROM。为什么这个程序就是不能找到它要的CD-ROM呢?
几天的研究后,那位同事找到了问题的原因。这个程序需要找到它的CD-ROM,于是就遍历所有26个驱动器盘符,并且像下面这样的传递SHGFI_DISPLAYNAME标志来调用SHGetFileInfo:
程序查询每一个驱动器的显示名称,试图找到一个名字形式是“LABEL(D:)”的驱动器。这里的LABEL是他们期待的卷标,D:是驱动器盘符。
换句话说,他们在尝试理解显示名称。
不要做类似的事情。没有任何担保说一个CD-ROM的显示名称一定是某个特定的形式。碰巧Windows XP中默认的形式是“LABEL (D:)”,但有多种多样的系统策略可改变它,这些策略中任何一个第一次,这个程序就将找不到它要的CD-ROM,并且拒绝工作了。
(事实上,这个工作正确的做法是将每一个驱动器盘符传递给GetDriveType函数,判断这个驱动器是否是一个DRIVE_CDROM;对每一个这样驱动器,通过调用GetVolumeInformation来得到CD-ROM的卷标)
因此请牢记:显示名称仅仅用于显示目的。
原文出处:http://blogs.msdn.com/oldnewthing/archive/2007/03/13/1868542.aspx