2014-01-14 3 views
-1

많은 함수가 출력 문자열인데 크기를 설정해야합니다.함수의 크기 매개 변수

GetComputerNameW 요구 :

WCHAR wStrName[16U]; 
DWORD uSize = 16U; 
GetComputerNameW(wStrName, &uSize); 

RegSetValueExW 요구 :

WCHAR wStrExec[1024U]; 
RegSetValueExW(..., (wcslen(wStrExec) + 1U) * sizeof(WCHAR)); 

GetWindowTextW 요구 :

WCHAR wStrText[1024U]; 
GetWindowsTextW(..., sizeof(wStrText)); 

GetModuleBaseNameW 요구 사항 : 크기의 차이가 설정

WCHAR wStrName[1024U]; 
GetModuleBaseNameW(..., sizeof(wStrName)/sizeof(WCHAR)); 

내 질문은, 어떻게 만들 수 있습니까? 문자열은 항상 WCHAR로 정의되고 크기 세트는 너무 많이 다릅니다.

+2

, 당신은 각 개별 기능의 문서를 읽어 통과해야 정확이 무엇인지를 결정해야한다는 그를 전달합니다. 'sizeof (wStrName)/sizeof (WCHAR)'는 Visual C++' '('_countof'는 비표준 확장자 임)의'_countof'를 사용하여'_countof (wStrName)'로 단축 될 수 있습니다. –

+0

질문을 다시 말 해주실 수 있습니까? 네가 무엇을 요구하는지 이해하지 못한다. 크기 정보를 전달해야하는 이유 또는 이러한 함수가 크기 정보를 사용하는 방법 등을 묻고 있습니까? – Praetorian

+0

'GetWindowTextW'가 올바르지 않습니다. 1024 또는'sizeof (wStrText)/sizeof (WCHAR)'여야합니다. –

답변

0

주의 깊게 read the documentation 당신은, 당신은 크기 매개 변수는 일반적으로 바이트 출력 버퍼의 크기 것을 볼 경우 정보의 크기는 lpData 매개 변수가 가리키는

cbData [in] 

가에, 바이트. 데이터 형식이 REG_SZ, REG_EXPAND_SZ 또는 REG_MULTI_SZ 인 경우 cbData에는 종료 널 문자 크기 또는 문자가 포함되어야합니다. 당신이 필요 물론 수익률의

: 한마디로

WCHAR wStrExec[1024U]; 
RegSetValueExW(..., sizeof (wStrExec)); 
+0

문자열이있는'RegSetValueExW'의 경우, 데이터가 들어있는 버퍼의 부분 만 사용해야합니다. 그렇지 않으면 레지스트리에 초기화되지 않은 스택 쓰레기가 기록되어 정보 공개 보안 문제가 될 수 있습니다. –

+0

@ RaymondChen : 충분합니다. –