Чтение и запись ключей реестра. C ++ MFC MBCS.

Я хотел бы обнаружить и, если возможно, прочитать в CString раздел реестра, начинающийся с «HKEY_LOCAL_MACHINE \ SOFTWARE \ blah \ SetupPath».

Я вижу MSDN на функцию RegOpenKeyEx

LONG WINAPI RegOpenKeyEx(
_In_        HKEY hKey,
_In_opt_    LPCTSTR lpSubKey,
_Reserved_  DWORD ulOptions,
_In_        REGSAM samDesired,
_Out_       PHKEY phkResult
);

Так что для этого, похоже, мне нужно настроить несколько вещей.

HKEY hKey = HKEY_LOCAL_MACHINE;
LPCTSTR lpSubKey = "SOFTWARE\blah\SetupPath";

И чтобы увидеть, существует ли ключ, просто сделайте

LONG res = RegOpenKeyEx(hKey, lpSubKey, 0, 0, 0);
if(res == ERROR_SUCCESS)
// The key exists

Теперь, если ключ существует, я хочу прочитать, что там, в CString. Я также вижу RegQueryValueEx

LONG WINAPI RegQueryValueEx(
_In_         HKEY hKey,
_In_opt_     LPCTSTR lpValueName,
_Reserved_   LPDWORD lpReserved,
_Out_opt_    LPDWORD lpType,
_Out_opt_    LPBYTE lpData,
_Inout_opt_  LPDWORD lpcbData
);

Это также выглядит так, как будто мне нужна некоторая настройка, прежде чем я вызову эту функцию.

HKEY hKey = HKEY_LOCAL_MACHINE;
lpSubKey = "SOFTWARE\blah\SetupPath";
LPDWORD type = null;
LPDWORD data = null;

Теперь я могу назвать это

LONG res2 = RegValueQueryEX(hKey, lpSubKey, 0, type, data,0);

Тогда я думаю, что я могу проверить, чтобы увидеть тип, а затем привести к строке?

CString regVal;
if(res2 == ERROR_SUCCESS)
if(type == REG_SZ)
if(data != null)
regVal = new CString((LPSTR)data);

Это все правильно? Чего мне не хватает или что мне нужно сделать?

3

Решение

Нет, это не правильно. Ваше главное недоразумение — как работают указатели в C ++. Недостаточно указать NULL для аргумента указателя, необходимо указать указатель на переменную, чтобы RegOpenKeyEx или же RegValueQueryEx рутина может вернуть значение этой переменной. Вы также, кажется, неправильно понимаете, как назначить CString (нет необходимости в new). Наконец, хотя это и не ошибка, вам не нужно выполнять настройку, вы просто передаете значения непосредственно в функцию.

Сначала откройте ключ

HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\blah", 0, 0, &key);

затем получить значение

DWORD type, size;
char data[99];
size = sizeof(data);
RegQueryValueEx(key, "SetupPath", 0, &type, (BYTE*)data, &size);

затем назначьте значение вашему CString

CString regval(data);

наконец закройте ключ

RegCloseKey(key);

Нет проверки ошибок в этом коде, вы должны добавить его. Также я предполагаю, что любое значение, которое вы можете получить, уместится в 99 байтах, что может быть неверным.

Обратите внимание, как я передаю указатель на key переменная, так что RegOpenKeyEx могу вернуть ключ. Затем я использую этот ключ в вызове RegValueQueryEx а также RegCloseKey, То же самое для type а также size переменные. Также обратите внимание, что я разделил путь между вызовами RegOpenKeyEx а также RegValueQueryEx, я считать это правильно.

Не уверен на 100%, что это правильно, я не проверял, но должен быть немного ближе.

1

Другие решения

Это все правильно? Чего мне не хватает или что мне нужно сделать?

В дополнение к ответу Джона я бы предложил несколько модификаций:

  1. проходить KEY_READ | KEY_QUERY_VALUE как маска прав доступа к RegOpenKeyEx если вы только собираетесь прочитать ключ.

  2. RegQueryValueEx может вернуться ERROR_MORE_DATA если размер буфера слишком мал. Если вы заранее не знаете размер данных, вы можете вызвать их в цикле.

1

Простой способ включить выполнение JavaScript в Internet Explorer с помощью реестра:

HKEY hKey;
RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3"),
NULL, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,
NULL, &hKey, NULL);

DWORD byte = 0x0;

RegSetValueEx(hKey, L"1400", NULL, REG_DWORD, (BYTE*)&byte, sizeof(byte));
RegCloseKey(hKey);
0
По вопросам рекламы [email protected]