2011-01-18 6 views

답변

9

lpnSize 매개 변수에 전달 된 크기는 null 종결 자의 공간을 포함하여 버퍼에서 사용할 수있는 공간의 양을 반영합니다. 첫 번째 문장에서는 사용 가능한 단어보다 하나 이상의 바이트를 할당하기 때문에 문장이 작동합니다.

당신은 훨씬 적은 1024보다

TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1]; 
DWORD size = sizeof(computerName)/sizeof(computerName[0]); 
GetComputerName(computerName, &size); 
+1

@Yan 쳉 CHEOK을 : 분할은 일반적인 관용구입니다 배열 크기 나 형식을 명시 적으로 참조하지 않고 정적으로 할당 된 배열의 요소 수를 결정합니다. 예, 당신은'DWORD size = MAX_COMPUTERNAME_LENGTH + 1; '이라고 말할 수 있습니다. 그러나 그것은 단지 반복적 인 것이며 나중에 배열의 크기를 변경하기로 결정하면 오류가 발생하기 쉽습니다. –

+0

TCHAR의 크기는 코드가 빌드하는 문자 집합에 따라 변경 될 수 있다는 점을 강조 할 가치가 있다고 생각합니다. 유니 코드 = 2 바이트, MBCS = 1 바이트. 그래서 sizeof division 관용구가 사용되는 이유는 무엇입니까 :) – TinyRacoon

1

해야 할 문서는 명시 적으로 말한다 :

버퍼 크기가 충분히 포함 할 MAX_COMPUTERNAME_LENGTH + 1

그리고 커야한다 :

버퍼가 너무 작 으면 함수가 실패하고 GetLastError 이 ERROR_BUFFER_OVERFLOW를 반환합니다. lpnSize 매개 변수는 null 문자 종료 문자 을 포함하여 버퍼의 크기가 인 것을 지정합니다.

  1. 이 작은 버퍼를 생성 길이 MAX_COMPUTERNAME_LENGTH + 1
  2. 와 버퍼를 작성,하지만 너무 작다 경우 오류 값을 잡을해야합니다 :

당신도 있다는 것을 의미한다. 이 경우 입력시 [lpnSize]는 버퍼의 크기를 TCHAR로 지정합니다. 두 번째 버전이 맞습니다.

0

size은 문자열의 길이가 아니라 버퍼의 크기입니다 (입력시). 출력시 문자열의 길이입니다. 두 번째 버전이 맞습니다. 첫 번째는 상처를주지 않습니다. 그러나 하드 코딩 된 값 대신 MAX_COMPUTERNAME_LENGTH를 사용하는 것을 고려해보십시오.

1

이럴 인 대신 MAX_COMPUTERNAME_LENGTH을 사용할 수 있습니다, 당신은 시도 할 수 있습니다 :

CString value; 
DWORD size = 1024; 
if(!GetComputerName(value.GetBufferSetLength(size), &size)){ 
    value = _T(""); 
} 
return value; 
관련 문제