2010-07-13 129 views
3

我正在做一些win32字符串API調用,並假設字符串以寬字符串出現,這在XP和更新的版本中是有效的。我怎麼能斷言這一點?這是運行時檢查還是編譯時檢查?在運行時,我怎麼知道我是否在WinXP +上? win32

我做錯了嗎?這裏有一個例子:

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(""); 
} 
+0

我錯過了什麼嗎?根據msdn,RegQueryValueEx已經出現在Win2000中,它也完全支持unicode。 – 2010-07-13 19:41:01

回答

4

這是一個不是問題的問題。早在XP發佈之前,Windows在過去的17年中一直是原生的Unicode操作系統。 David Cutler的大腦孩子NT 3.1從第一天開始就是Unicode。

如果您的程序出現在Window 9x計算機上,但仍然存在API層,可以將UTF-16字符串轉換爲8位字符。使用TCHAR進行新代碼開發沒有任何意義。

+0

我正在修改其他人廣泛使用TCHAR的代碼。在我的代碼中使用std :: wstring是更好的形式嗎? wstring應該相當於在widechar平臺上的TString,所以我沒有看到問題。 – 2010-07-13 20:33:43

+0

我不知道「TString」可能是什麼。另一個宏?在一個傳統的源代碼文件中混合字符串typedefs不可能贏得任何朋友。 – 2010-07-13 20:46:20

+0

我打開了一個新的問題:http://stackoverflow.com/questions/3241645/proper-style-for-interfacing-with-legacy-tchar-code – 2010-07-13 21:21:57

1

我認爲,這是怎麼回事,就是當我編譯,我編譯反對統一的Windows API,所以如果我在非widechar窗口中運行我的可執行文件,它將無法運行。因此運行時檢查是無用的。

如果我們在非widechar平臺上編譯(XP之前,或2000之前,或其他任何版本)編譯將失敗,我添加了編譯時斷言來強制生成錯誤。如果斷言不存在,它將會失敗,但更加隱祕。

相關問題