Должен ли я освободить место, как это:
len = MAX_PATH * sizeof(_TCHAR) + sizeof(_TCHAR);
или это:
len = MAX_PATH + sizeof(_TCHAR);
Правильный размер для хранения пути, включая Юникод?
MAX_PATH
(который всегда 260) выражается в символах, а не в байтах.
Используйте первый при выделении необработанной памяти, выраженной в байтовых размерах, например:
LPTSTR path = (LPTSTR) LocalAlloc(LMEM_FIXED, (MAX_PATH + 1) * sizeof(TCHAR));
Используйте второй при выделении памяти, которая выражается в символах, например:
TCHAR path[MAX_PATH + 1];
LPTSTR path = new TCHAR[MAX_PATH +1];
MAX_PATH
определяется как 260 в Windef.h
независимо от Unicode.
Первый подход хорош, если вы держите количество байтов. Второй подход не имеет никакого смысла. Если вы держите количество символов, вы должны использовать MAX_PATH+1
,
Определение макроса MAX_PATH (260 байт) является принятым стандартом ANSI. К сожалению, этот стандарт был разработан задолго до появления 32-битной ОС.
В настоящее время Unicode-версии файловых библиотек (Windows) поддерживают путь до 32 767 байт.
Однако определение MAX_PATH остается таким же, как и для (16-разрядной) MS-DOS