在运行时,如何判断我是否使用WinXP +?的win32

时间:2010-07-13 19:16:48

标签: c++ windows winapi

我正在进行一些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("");
}

3 个答案:

答案 0 :(得分:4)

这不是问题。在XP发布之前很久,Windows已经成为过去17年的原生Unicode操作系统。 David Cutler的脑子NT 3.1从第一天开始就是Unicode。

如果您的程序落在Window 9x机器上,那么仍然有一个API层可以将您的UTF-16字符串转换为8位字符。使用TCHAR进行新代码开发没有任何意义。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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