2010-05-23 6 views
1

나는 윈도우 버전을 얻으려면이 코드를 사용하고 있습니다 :LPTSTR의 시작 부분에 이상한 문자가 있습니까? C++

#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; 
} 

을 그리고 나는 그것을 테스트입니다 : (여기서 5.1

LPTSTR OSv= new TCHAR[BUFSIZE]; 
config c; 
c.GetOS(OSv); 
MessageBox(OSv, 0, 0); 

그리고 MSGBOX에 나는이 äì5.1.20 같은 것을 얻을 .20 is = to OSv)하지만 처음 2 ~ 3 문자는 그들이 어땠는지 모를 이상한 문자입니다. 낯선 사람이라 할지라도, 두 번째 작품을 다시 불러 주면 처음에는 이상한 캐릭터 만 보여줄 것입니다.

누군가 여기서 무슨 일이 일어 났는지 생각하고 있습니까?

답변

3

귀하의 문제는 당신이 StringCchCopy하지 StringCchCat를 사용한다는 것입니다.

StringCchCat은 문자열에서 0을 찾은 다음 검색 결과를 추가 할 때까지 검색합니다. 출력 문자열 버퍼를 0으로 초기화하지 않으므로 0으로 시작한다고 가정 할 수 없습니다.

+1

문제의 근원은 초기화되지 않은 메모리 블록이지만 cat 대신 copy를 사용하는 것이 그 일을 처리하는 한 가지 방법입니다. +1. –

+1

마찬가지로, 어느 쪽이든 작동합니다. 근본적인 문제는 StringCchCat의 오해이거나 버퍼를 초기화하는 것을 잊어 버리는 것입니다. –

+0

어떻게 메모리 블록을 초기화합니까? – extintor

2

LPTSTR OSv= new TCHAR[BUFSIZE];. < - 메모리 블록을 초기화하지 않았습니다. 그것은 무작위로 쓰레기로 가득 차 있습니다.

질문에 태그를 달았습니다. 수동으로 메모리를 관리하는 대신 여기에 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(); 
} 
+0

std :: 사용 방법을 알지 못합니다. 며칠 전에 cpp를 사용하기 시작했습니다. 무엇을 포함, 등 내가 std를 사용해야합니까? – extintor

+0

'std'는 전체 표준 라이브러리가 상주하는 네임 스페이스입니다. 아마도 네가 네임 스페이스 std를 사용하고있는 것을 배우고있을 것이다. 위의 코드에서'std ::'를 제거 할 수있다. 위의 코드에서는'std :: wstringstream'에''이 필요하며'std :: wstring'에는''이 필요합니다. –

+0

내 프로젝트를 최소한의 포함 가능한 것으로 유지하려고하는데, 어떤 라이브러리가 "namespace std;"를 사용할 것인가? 더하다? 응용 프로그램을 실행하는 컴퓨터가 제대로 작동하도록 컴퓨터를 설치해야합니까? – extintor

관련 문제