Странные персонажи в начале LPTSTR?C ++ - PullRequest
1 голос
/ 23 мая 2010

Я использую этот код для получения версии 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.1.20 (где 5.1.20 = для OSv), но первые 2 или 3 символа являются странными символами, о которых я не знаю, когда они появились. Даже более странно, если я вызову этот второй фрагмент снова, он покажет, что все в порядке, он покажет странные символы только при первом выполнении.

У кого-то есть идея, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 23 мая 2010

Ваша проблема в том, что вы должны использовать StringCchCopy , а не StringCchCat.

StringCchCat будет искать, пока не найдет 0 в строке, а затем добавит результат туда. Поскольку вы не инициализируете свой выходной строковый буфер равным 0, вы не можете предполагать, что он будет начинаться с 0.

2 голосов
/ 23 мая 2010

LPTSTR OSv= new TCHAR[BUFSIZE];.<- Вы не инициализировали блок памяти.Он заполнен случайным мусором. </p>

Вы отметили свой вопрос 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...