2014-01-14 9 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)' можно сократить до '_countof (wStrName)', используя '_countof' из Visual C++' '(' _countof' - это нестандартное расширение). –

+0

Не могли бы вы перефразировать свой вопрос, пожалуйста? Я не понимаю, о чем вы спрашиваете. Вы спрашиваете, почему нам нужно передавать информацию о размере или как эти функции используют информацию о размере или что-то еще? – Praetorian

+0

Неверный параметр 'GetWindowTextW'. Он должен быть 1024 или 'sizeof (wStrText)/sizeof (WCHAR)'. –

ответ

0

Если вы внимательно read the documentation, вы увидите, что параметр это размер выходного буфера в байтах обычно:

cbData [in] 

Размер информации, на которую указывает параметр lpData, в байт. Если данные имеют тип REG_SZ, REG_EXPAND_SZ или REG_MULTI_SZ, cbData должен содержать размер завершающего нулевого символа или символов.

который, конечно, урожайности, что вам нужно:

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

В случае 'RegSetValueExW' со строкой вы должны использовать только часть буфера, содержащего данные. В противном случае вы записываете неинициализированный мусор стека в реестр, который может быть уязвимостью для раскрытия информации. –

+0

@RaymondChen: достаточно справедливо. –