“显示名称”只能用于“显示”

ight:450px;width:100%;">

  有很多函数返回被称为“显示名称(display names)”的字符串。对于这些显示名称你可以做的唯一一件事就是拿来显示。不要假设这些字符串有任何实际的意义,因为它们的确没有意义。

理论上,一个类似于SHGetFileInfo这样的函数可以被实现成:

...
 
if  (uFlags  &  SHGFI_DISPLAYNAME) {
    StringCchCopy(psfi
-> szDisplayName, MAX_PATH, TEXT( " Booga! " ));
 } 
...

 

你的程序应当仍然可以正常运行。

(当然,这不过是一个基本准则。一些特定的函数可能会有例外。如带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:

//  实际的代码远比这里给出的令人费解
char  LookForCD(LPCTSTR pszVolumeLabel)
{
    
for  (TCHAR chDrive  =  TEXT( ' A ' ); chDrive  <=  TEXT( ' Z ' ); chDrive ++ ) {
        TCHAR szRoot[
4 ];
        wsprintf(szRoot, TEXT(
" %c:/ " ), chDrive);

        SHFILEINFO sfi;
        
if  (SHGetFileInfo(szRoot,  0 & sfi,  sizeof (sfi), SHGFI_DISPLAYNAME)) {
            TCHAR szExpected[MAX_PATH];
            wsprintf(szExpected, TEXT(
" %s (%c:) " ), pszVolumeLabel, chDrive);

            
if  (strcmp(szExpected, sfi.szDisplayName)  ==   0 ) {
                
return  chDrive;  //  找到了
            }
        }
    }
    
return   0 //  没找到
}

 

程序查询每一个驱动器的显示名称,试图找到一个名字形式是“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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值