Функции реестра не работают при некоторых обстоятельствах

0

Мне нужно программно отключить отчет об ошибках Windows в моем приложении C++. Для этого я хочу отредактировать реестр Windows и записать в него два значения.

Следующий код отлично работает на моей 32-битной машине Windows 7:

#include <stdio.h>
#include <Windows.h>

void DisableWER()
{
        HKEY key;
        printf("%d\n", RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\Windows Error Reporting\\"), &key));

        DWORD val = 1;
        printf("%d\n", RegSetValueEx(key, TEXT("Disable"), 0, REG_DWORD, (const BYTE*)&val, sizeof(val)));

        RegCloseKey(key);
}

int main()
{
        DisableWER();

        printf("%d\n", GetLastError());
        getchar();
}

Обе функции успешны (верните ERROR_SUCCESS), GetLastError() печатает 0, а требуемое значение задано в реестре.

На моем VPS вывод программы тот же, но реестр на самом деле не модифицирован - просто ничего не происходит. Я могу установить значение вручную с помощью regedit, поэтому я предполагаю, что это не проблема, связанная с привилегиями. VPS запускает Windows Server 2008 R2, 64-разрядный.

Что может быть причиной? Возможно ли, что конфигурация хоста VPS вмешивается в Windows API?

Теги:
registry

1 ответ

1
Лучший ответ

Если вы получите ERROR_SUCCESS, то вы знаете, что функция выполнена успешно и что реестр был фактически обновлен. Не используйте GetLastError() вообще, реестр api не использует его.

Вы просто ищете неправильное место для изменения, 32-разрядный процесс перенаправляется в 64-разрядную операционную систему. Поэтому первое место для поиска находится в разделе реестра HKLM\SOFTWARE\Wow6432Node.

Создайте свою целевую программу на уровне x64, чтобы избежать перенаправления, или используйте параметр KEY_WOW64_64KEY в RegOpenKeyEx(). Ваша программа должна работать с повышенными возможностями, чтобы иметь возможность изменять этот ключ, использовать соответствующую запись манифеста (requireAdministrator) для активации приглашения UAC. Утилита Process Monitor SysInternals отлично подходит для устранения неполадок с доступом к реестру.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню