К сожалению, в этом коде почти все не так.
LPWSTR lpName=nullptr;
LPWSTR lpClass=nullptr;
Всякий раз, когда документация для параметра функции говорит что-то вроде " Указатель на буфер ", вы должны предоставить буфер, который вы выделили.
// The {} brackets zero-initialize the buffers.
wchar_t szName[255]{};
wchar_t szClass[255]{};
DWORD TMP=255;
DWORD cchClasss=0;
Установка cchClass
на ноль неверна. Вы должны сообщить функции, насколько велики ваши буферы (сколько символов, включая «\ 0», она может хранить там). Переменная TMP
не имеет значащего имени, cchName
будет более согласованным:
// No need to hardcode the array size.
DWORD cchName = ARRAYSIZE(szName);
DWORD cchClass = ARRAYSIZE(szClass);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",0,KEY_READ,&RegHkey);
Отсутствует проверка на успешность функции. Открытие раздела реестра может завершиться неудачей по целому ряду причин, e. г. недостаточно прав:
DWORD res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",0,KEY_READ,&RegHkey);
if(res == ERROR_SUCCESS)
{
// do something with the registry key
}
while(RC != ERROR_NO_MORE_ITEMS)
У вас есть бесконечный цикл, когда RegEnumKeyEx
дает сбой по другим причинам, кроме завершения перечисления. Правильное условие будет RC == ERROR_SUCCESS
.
RC=RegEnumKeyEx(RegHkey, a, lpName, &TMP, nullptr, lpClass, &cchClass, &filetime);
Дочерние ключи реестра SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
являются значениями, поэтому вместо них следует использовать RegEnumValueW()
.
Убедитесь, что вы также позвонили RegCloseKey()
, как только вы закончите с ключом реестра.