У меня возникают проблемы при открытии раздела реестра с помощью функции RegOpenKeyEx. Конкретная программа, которую я пишу, устанавливает шрифты на компьютер, и они должны быть добавлены в реестр, чтобы оставаться установленными после перезагрузки. Я новичок в использовании реестра, поэтому я много искал, но столкнулся с проблемой. Вот пример, который показывает аргументы, которые я посылаю RegOpenKeyEx:
int main() {
HKEY key;
long code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_ALL_ACCESS, &key);
if(code != ERROR_SUCCESS) {
std::cout << code << std::endl;
return 1;
}
RegCloseKey(key);
return 0;
}
Функция возвращает 1 (ERROR_INVALID_FUNCTION). Однако следующее работает и возвращает 0:
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_ALL_ACCESS, &key);
Я не знаю, как поступить, поэтому любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: я подтвердил с regedit, что ключ существует. Похоже, что если второй аргумент RegOpenKeyEx не равен NULL, он возвращает код ошибки 2.
РЕДАКТИРОВАТЬ 2: Я пробовал несколько решений, в том числе с помощью функции TEXT () на подразделе и изменения прав доступа на KEY_SET_VALUE, но я все еще получаю ту же ошибку. Я также пытался использовать RegCreateKeyEx. Странно, я все еще получаю код ошибки 2, хотя иногда я получаю код ошибки 122 (ERROR_INSUFFICENT_BUFFER).
РЕДАКТИРОВАТЬ 3: Я изменил обработку ошибок, чтобы она напрямую использовала возвращаемое значение функции вместо GetLastError (). Теперь я получаю код ошибки 5 (ERROR_ACCESS_DENIED).
HKEY_LOCAL_MACHINE
дескриптор псевдо-ключа указывает на ключ с именем \Registry\Machine
которая служит одной из точек крепления для кустов реестра. Я сомневаюсь, что вы можете открыть этот ключ или перечислить его подразделы через стандартный Windows API, такой как RegOpenKeyEx
, Может быть, нативные API (NtOpenKey
) должно сработать.
Вы можете создать подраздел под HKEY_LOCAL_MACHINE
ключ, позвонив RegLoadKey
функция. Если вам нужно перечислить такие подразделы, вы можете посмотреть значения в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
; имена значений говорят вам путь к реестру — те, которые начинаются с \Registry\Machine
являются подразделами HKEY_LOCAL_MACHINE
,
HKEY_USERS
вероятно показывает то же поведение.
Других решений пока нет …