Блок кода, который начинается с комментария «Получить название предмета», не имеет смысла для меня. Если вы получаете элемент списка, почему код задает параметры получаемого элемента, потому что, если у вас уже есть значения, их не нужно будет извлекать.
После этого комментария в первой строке указывается TreeView_GetItem (который, кстати, фактически является замаскированным SendMessage), который мы хотим извлечь из текста элемента и связанного с ним lParam. Следующая строка указывает дескриптор элемента, о котором мы хотим получить информацию.
Следующая строка указывает, где должен быть сохранен полученный текст, т. Е. В буфере szName, который был выделен в начале функции; последняя строка перед вызовом функции указывает размер такого буфера, чтобы избежать переполнения буфера.
Я предлагаю вам взглянуть на документацию TreeView_GetItem и TVITEM , чтобы лучше понять, что происходит.
Во-вторых, рядом с комментарием «оригинал» - это оригинальная строка кода, которая будет компилироваться с использованием varning под встроенным Visual C ++, но если вы скопируете точно такой же код в Visual Studio 2008, он не скомпилируется. Поскольку я не написал ни одного из этого кода и пытаюсь узнать, возможно ли, что первоначальный автор допустил ошибку в этой строке, поскольку * pRoot должен указывать на тип HKEY и тип HKEY, но он приводит к типу HTREEITEM, который никогда не должен работать типы данных не совпадают?
Не ясно, что код пытается там делать; на первый взгляд я бы сказал, что в lParam, связанном с каждым элементом в корневом узле дерева, хранится дескриптор ключа реестра, и процедура извлекает его таким образом. Тем не менее, если бы это было так, бросок (HTREEITEM) не имел бы никакого смысла; вероятно, это была ошибка, прощенная компилятором, потому что он обрабатывал все дескрипторы как просто void *; если моя гипотеза верна, вы должны сохранить исходную строку, просто заменив (HTREEITEM) на (HKEY).