读写注册表键值。C++ MFC MBCS。

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

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

3个回答

1
不,那不正确。你主要的误解是指针在C++中的工作原理。仅仅为指针参数提供NULL是不够的,你必须提供一个指向变量的指针,这样RegOpenKeyExRegValueQueryEx例程就可以将值返回给该变量。你似乎也误解了如何分配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 regval(data);

最后关闭密钥。
RegCloseKey(key);

那段代码中没有错误检查,你应该添加它。另外我假设你能得到的任何值都适合99个字节,但这可能不是真的。

请注意,我传递了一个指向key变量的指针,以便RegOpenKeyEx可以返回该键。然后,我在调用RegValueQueryExRegCloseKey时使用该键。对于typesize变量也是如此。还要注意,我将路径分割为调用RegOpenKeyExRegValueQueryEx之间。我认为这是正确的。

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


虽然这样可以工作,但它忽略了 CStringGetBuffer / ReleaseBuffer 机制。这种模式符合典型的 Win32 使用方式;您获得一个固定大小的缓冲区,调用 API,并将使用了多少缓冲区的信息返回给 CString - MSalters
1
如果代码对我有用,但在我的情况下只有读取访问权限: RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\blah", 0, KEY_READ, &key); 如果我使用 0 而不是 KEY_READ,那么 key 将为 NULL。 - Valentin Safonnikov

1

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

除了john的答案外,我建议进行一些修改:

  1. 如果您只打算读取键,则将KEY_READ | KEY_QUERY_VALUE作为访问权限掩码传递给RegOpenKeyEx

  2. 如果缓冲区大小太小,RegQueryValueEx可能会返回ERROR_MORE_DATA。除非您事先知道数据的大小,否则您可能想要在循环中调用它。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接