读写注册表项。 C ++ MFC MBCS。

时间:2013-04-17 15:20:20

标签: c++ mfc registry mbcs

我想检测,如果可能,请读取CString,一个以“HKEY_LOCAL_MACHINE \ SOFTWARE \ blah \ SetupPath”开头的注册表项。

我在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 个答案:

答案 0 :(得分: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

CString regval(data);

最后关闭密钥

RegCloseKey(key);

在该代码中没有错误检查,您应该添加它。此外,我假设您可以获得的任何值都适合99个字节,这可能不是真的。

注意我如何将指针传递给key变量,以便RegOpenKeyEx可以返回密钥。然后,我在调用RegValueQueryExRegCloseKey时使用了该密钥。 typesize变量也是如此。另请注意,我已将RegOpenKeyExRegValueQueryEx的调用之间的路径分开。我认为是正确的。

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

答案 1 :(得分:1)

  

这一切都正确吗?我可能缺少什么或需要做什么?

除了约翰的回答,我建议做一些修改:

  1. 如果您只是要阅读密钥,请将KEY_READ | KEY_QUERY_VALUE作为访问权限掩码传递给RegOpenKeyEx

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

答案 2 :(得分: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);