【问题标题】:at runtime, how can I tell if I'm on WinXP+? win32在运行时,我如何判断我是否在 WinXP+ 上? win32
【发布时间】:2010-07-13 19:16:48
【问题描述】:

我正在进行一些 win32 字符串 API 调用,并假设字符串以宽字符串形式出现,这在 XP 和更新版本上有效。我怎么能断言呢?这是运行时检查还是编译时检查?

我做错了吗?这是一个例子:

typedef std::basic_string<TCHAR> TString;
inline TString queryRegStringValue(HKEY key, const TString& subkey, 
        const TString defaultValue = TEXT(""))
{
    std::vector<char> out_bytes(256);
    DWORD num_bytes = out_bytes.size();
    DWORD out_type;
    long retval = RegQueryValueEx(key, subkey.c_str(), 0, &out_type, 
        reinterpret_cast<BYTE*>(&out_bytes[0]), &num_bytes); //comes out as a platform string. wide on XP
    if (retval != 0)
        return defaultValue;
    if (num_bytes > 0)
    {
        assert(out_type == REG_SZ);
        BOOST_STATIC_ASSERT(sizeof(TCHAR)==2); //what if someone runs my code on an older system?
        return TString(reinterpret_cast<wchar_t*>(&out_bytes[0]), num_bytes/2); //assumes windows XP (wide string)
    }

    return TEXT("");
}

【问题讨论】:

  • 我错过了什么吗?据msdn介绍,Win2000中已经存在RegQueryValueEx,它也完全支持unicode。

标签: c++ windows winapi


【解决方案1】:

这不是问题。在过去的 17 年里,Windows 一直是原生 Unicode 操作系统,早在 XP 发布之前。 David Cutler 的智囊 NT 3.1 从一开始就是 Unicode。

如果您的程序运行在 Window 9x 机器上,这种情况不太可能发生,但仍有一个 API 层可以将您的 UTF-16 字符串转换为 8 位字符。使用 TCHAR 进行新代码开发已经没有意义了。

【讨论】:

  • 我正在修改广泛使用 TCHAR 的其他人的代码。在我的代码中只使用 std::wstring 是不是更好的形式? wstring 应该等同于 Widechar 平台上的 TString,所以我没有看到问题。
  • 我不知道“TString”可能是什么。另一个宏?在一个遗留源代码文件中混合字符串 typedef 不太可能赢得任何朋友。
  • 我开了一个新问题:stackoverflow.com/questions/3241645/…
【解决方案2】:

我认为这篇 MSDN 文章正是您想要的。您想知道您使用的是哪个版本的 Windows,并适当地调整您的字符串处理?如果我误解了,请随时发表评论,我会调整我的答案。

http://msdn.microsoft.com/en-us/library/ms724429.aspx

【讨论】:

    【解决方案3】:

    我认为发生的情况是,当我编译时,我针对 Unicode windows API 进行编译,所以如果我在非 Widechar 窗口上运行我的可执行文件,它将无法运行。因此运行时检查是没有用的。

    我添加了编译时断言来强制生成错误,如果我们在非 Widechar 平台(XP 之前、2000 之前或其他任何平台)上编译,则构建将失败。如果断言不存在,它无论如何都会失败,但更神秘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2012-03-28
      • 2013-09-14
      相关资源
      最近更新 更多