Я хотел бы обнаружить и, если возможно, прочитать в 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);
Это все правильно? Чего мне не хватает или что мне нужно сделать?
Нет, это не правильно. Ваше главное недоразумение — как работают указатели в 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%, что это правильно, я не проверял, но должен быть немного ближе.
Это все правильно? Чего мне не хватает или что мне нужно сделать?
В дополнение к ответу Джона я бы предложил несколько модификаций:
проходить KEY_READ | KEY_QUERY_VALUE
как маска прав доступа к RegOpenKeyEx
если вы только собираетесь прочитать ключ.
RegQueryValueEx
может вернуться ERROR_MORE_DATA
если размер буфера слишком мал. Если вы заранее не знаете размер данных, вы можете вызвать их в цикле.
Простой способ включить выполнение 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);