3

我想检测一个以“HKEY_LOCAL_MACHINE\SOFTWARE\blah\SetupPath”开头的注册表项,并在可能的情况下读取到 CString。

我在 RegOpenKeyEx 函数上看到了 MSDN

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);

这一切都正确吗?我可能会错过什么或需要做什么?

4

3 回答 3

1

不,这是不正确的。您的主要误解是指针在 C++ 中的工作方式。为指针参数提供 NULL 是不够的,您必须提供指向变量的指针,以便RegOpenKeyExorRegValueQueryEx例程可以将值返回给该变量。您似乎也误解了如何分配给 a 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然后我在对and的调用中使用该键RegCloseKeytypesize变量相同。另请注意,我已经在对RegOpenKeyEx和的调用之间分割了路径RegValueQueryEx。我认为这是正确的。

不是 100% 确定这是正确的,我还没有测试过,但应该更接近一点。

于 2013-04-17T15:44:22.070 回答
1

这一切都正确吗?我可能会错过什么或需要做什么?

除了约翰的回答之外,我还建议进行一些修改:

  1. 如果您只想读取密钥,则KEY_READ | KEY_QUERY_VALUE作为访问权限掩码传递给。RegOpenKeyEx

  2. RegQueryValueExERROR_MORE_DATA如果缓冲区太小,可能会返回。除非您事先知道数据的大小,否则您可能希望循环调用它。

于 2013-04-17T15:47:08.053 回答
0

使用注册表在 Internet Explorer 中启用 javascript 执行的简单方法:

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);
于 2018-04-16T12:31:24.990 回答