SHGetPathFromIDList () (и подобные) помещает завершающий 0 в свой аргумент? - PullRequest
3 голосов
/ 27 августа 2009

Это на самом деле вопрос об огромном количестве функций winapi. Типичная документация MS гласит (от http://msdn.microsoft.com/en-us/library/bb762194(VS.85).aspx):

BOOL SHGetPathFromIDList(      
    PCIDLIST_ABSOLUTE pidl,
    LPTSTR pszPath
);

pidl [in] The address of an item identifier list that specifies a file
or directory location relative to the root of the namespace (the desktop).

pszPath [out] The address of a buffer to receive the file system path.
This buffer must be at least MAX_PATH characters in size.

Нигде не говорится о том, записан ли завершающий 0 в pszPath. Кроме того, он не говорит, может ли путь заполнить pszPath, не оставляя там места для 0.

Поискав вокруг yeidls о распределении 50/50 пользователей, которые выделяют буфер с MAX_PATH + 1 символов, и пользователей, которые имеют дело только с MAX_PATH.

Хотя я, безусловно, могу сделать что-то вроде char buf [MAX_PATH + 1] = {0}, чтобы быть в безопасности, мне бы очень хотелось знать - есть ли место, где описан этот материал? Может быть, какая-то страница для всех функций, связанных с путями, я не знаю ...

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

В параметре pszPath указано «Этот буфер должен иметь размер не менее MAX_PATH символов», поэтому MAX_PATH размера буфера всегда должно быть достаточно. Также я считаю, что все функции Win32, работающие с параметрами LPCTSTR / LPTSTR, ожидают или возвращают строки с нулевым символом в конце.

1 голос
/ 28 августа 2009

Чтобы ответить на заглавный вопрос: Да. Это часть определения LPTSTR - указатель на строку . Это также отражается в префиксе: psz - «Указатель (на) Строка (завершается) нулем».

Существует также тип строки с нулевым символом в конце, но он редко встречается в пользовательском API: UNICODE_STRING Вы видите это главным образом в API уровня ядра

1 голос
/ 27 августа 2009

Я не знаю, как на самом деле ведет себя эта функция (или другие), но я бы рекомендовал написать несколько модульных тестов для этой функции ... Что произойдет, если вы не используете весь буфер? Что произойдет, если вы делаете? и т. д. Мало того, что они документируют ваши предположения, но если функция когда-либо изменит свое поведение, вы получите предупреждение от ваших модульных тестов вместо того, чтобы появилось неприятное сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...