我正在使用此代码获取Windows版本:
#define BUFSIZE 256
bool config::GetOS(LPTSTR OSv)
{
OSVERSIONINFOEX osve;
BOOL bOsVersionInfoEx;
ZeroMemory(&osve, sizeof(OSVERSIONINFOEX));
osve.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osve)) )
return false;
TCHAR buf[BUFSIZE];
StringCchPrintf(buf, BUFSIZE, TEXT("%u.%u.%u.%u"),
osve.dwPlatformId,
osve.dwMajorVersion,
osve.dwMinorVersion,
osve.dwBuildNumber);
StringCchCat(OSv, BUFSIZE, buf);
return true;
}
我正在测试它:
LPTSTR OSv= new TCHAR[BUFSIZE];
config c;
c.GetOS(OSv);
MessageBox(OSv, 0, 0);
在msgbox中,我得到类似这样的东西äì5.1.20(其中5.1.20 = OSv),但前2或3个字符是一些奇怪的字符,我不知道它们何时来自。更奇怪的是,如果我再次称它为第二块它表明它没问题,它只会在我第一次执行它时显示奇怪的字符。
有人知道这里发生了什么吗?
答案 0 :(得分:3)
您的问题是您应该使用StringCchCopy而不是StringCchCat。
StringCchCat将搜索,直到它在字符串中找到0,然后在那里附加结果。由于您没有将输出字符串缓冲区初始化为0,因此您不能假设它将以0开头。
答案 1 :(得分:2)
LPTSTR OSv= new TCHAR[BUFSIZE];
。 < - 您尚未初始化内存块。它充满了随机垃圾。
您标记了自己的问题C ++ - 您是否有理由不使用std::vector<wchar_t>
或std::wstring
而不是手动管理内存?
std::wstring config::GetOS()
{
OSVERSIONINFOEX osve;
BOOL bOsVersionInfoEx;
ZeroMemory(&osve, sizeof(OSVERSIONINFOEX));
osve.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osve)) )
return L"ERROR"; //Actually the right thing to do here is throw an exception
//but I could see how that could be a problem for some code
std::wstringstream formatter;
formatter << osve.dwPlatformId << L'.'
<< osve.dwMajorVersion << L'.'
<< osve.dwMinorVersion << L'.'
<< osve.dwBuildNumber;
return formatter.str();
}