代码之家  ›  专栏  ›  技术社区  ›  DougN

查找本地化的Windows字符串

  •  5
  • DougN  · 技术社区  · 16 年前

    有人知道怎么做吗?

    谢谢莫里纳——我也偶然发现了那篇文章。不幸的是,stringID似乎不是常量——在我的Vista上是30396,这与它们在XP上显示的不同。所以看起来MS没有保持稳定。

    编辑:看来这是不可能的。。。?这个应用程序在德国、荷兰、法国、西班牙、巴西、墨西哥、越南、台湾、中国、日本、韩国、印度、以色列、匈牙利的计算机上运行。。。你明白了。安装所有不同的语言包并找出每种语言中的“新文件夹”需要很长时间。

    4 回复  |  直到 14 年前
        1
  •  8
  •   MSN    16 年前

    无耻地抄袭 http://blogs.msdn.com/oldnewthing/archive/2004/01/30/65013.aspx . 这基本上是正确的,但如果有一个资源字符串“New Folder something other”,它将匹配:

    LPCWSTR FindStringResourceEx(HINSTANCE hinst,
        UINT uId, UINT langId)
    {
        // Convert the string ID into a bundle number
        LPCWSTR pwsz = NULL;
        HRSRC hrsrc = FindResourceEx(hinst, RT_STRING,
            MAKEINTRESOURCE(uId / 16 + 1),
            langId);
        if (hrsrc) {
            HGLOBAL hglob = LoadResource(hinst, hrsrc);
            if (hglob) {
                pwsz = reinterpret_cast<LPCWSTR>
                    (LockResource(hglob));
                if (pwsz) {
                    // okay now walk the string table
                    for (int i = 0; i < (uId & 15); i++) {
                        pwsz += 1 + (UINT)*pwsz;
                    }
    
                    pwsz+= 1;
                }
            }
        }
        return pwsz;
    }
    
    UINT FindResourceStringId(HMODULE resource_handle, LPCWSTR string, UINT langId)
    {
        UINT resource_id= -1;
    
        for (int i= 0; i<65536; ++i)
        {
            LPCWSTR resource_string= FindStringResourceEx(resource_handle, i, langId);
    
            if (resource_string && wcsncmp(resource_string, string, wcslen(string))==0)
            {
                resource_id= i;
            }
        }
    
        return resource_id;
    }
    
    int main()
    {
        HMODULE shell_handle= LoadLibraryW(L"shell32.dll");
        UINT new_folder_id= FindResourceStringId(shell_handle, L"New Folder", 0x409); // look for US English "New Folder" resource id.
    }
    
        2
  •  4
  •   Luke    16 年前

    这不容易。这些字符串是Windows资源管理器的私有数据,因此它们可以(也可能会)在不同版本之间更改。您可以在执行大量版本检查和读取适当的资源字符串的地方修改某些内容,但这似乎是一场失败的战斗。你想完成什么?

        3
  •  2
  •   Morinar    16 年前

    不确定是否有更优雅的方式(我似乎找不到),但这些字符串存储在 %windir%\System32\Shell32.dll . 理论上,您只能读入该文件并提取适当的字符串。

    看起来有点老套,但应该能完成任务。以下是一篇文章的链接,该文章讨论了他们在上述文件中的居住地: http://www.askvg.com/customize-new-folder-and-new-shortcut-text-in-windows-xp/

        4
  •  -2
  •   call me Steve    16 年前

    我猜你是在一个企业环境中,你可以把文件夹名放回一个存储器,一周后(或任何时候)你就可以把这些名称取出来;更新你的应用程序;发布新版本将取悦用户(稍后在此处发布结果)

    你可以先发制人地在一系列你怀疑用户会使用的平台上测试你的应用程序。获取第一组文件夹名称。

    这将避免处理每个平台的特定代码的问题。

    编辑