Мне нужно программно отключить отчет об ошибках 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?
Если вы получите ERROR_SUCCESS, то вы знаете, что функция выполнена успешно и что реестр был фактически обновлен. Не используйте GetLastError() вообще, реестр api не использует его.
Вы просто ищете неправильное место для изменения, 32-разрядный процесс перенаправляется в 64-разрядную операционную систему. Поэтому первое место для поиска находится в разделе реестра HKLM\SOFTWARE\Wow6432Node.
Создайте свою целевую программу на уровне x64, чтобы избежать перенаправления, или используйте параметр KEY_WOW64_64KEY в RegOpenKeyEx(). Ваша программа должна работать с повышенными возможностями, чтобы иметь возможность изменять этот ключ, использовать соответствующую запись манифеста (requireAdministrator) для активации приглашения UAC. Утилита Process Monitor SysInternals отлично подходит для устранения неполадок с доступом к реестру.