LPTSTR开头有奇怪的字符? C ++

时间:2010-05-23 03:24:57

标签: c++ string winapi visual-c++

我正在使用此代码获取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个字符是一些奇怪的字符,我不知道它们何时来自。更奇怪的是,如果我再次称它为第二块它表明它没问题,它只会在我第一次执行它时显示奇怪的字符。

有人知道这里发生了什么吗?

2 个答案:

答案 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();
}