在c中打开注册表项

-3 c registry winapi

我使用regedit创建了一个密钥,现在我希望得到它的价值.它没有给出任何错误,但它没有显示任何内容.代码:

int main() {
    HKEY hKey;
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Ehsan Akbari", 0, KEY_ALL_ACCESS, &hKey);
    TCHAR sz[50];
    DWORD size = 50,type;
    RegEnumValue(hKey, 0, L"test", &size, NULL, &type, (LPBYTE)sz, &size);
    RegCloseKey(hKey);
    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注册图片:图片

我究竟做错了什么?

编辑


当我调试我看到hKeyNULL,但GetLastError不报什么.

Dav*_*nan 6

以下是我可以看到的直接问题:

  1. 您没有检测到错误,因为您没有检查错误.阅读每个功能的文档.错误代码在返回值中返回.
  2. 你问KEY_ALL_ACCESS哪个不会被授予HKLM.您需要请求只读访问权限KEY_READ.
  3. 您的屏幕截图显示已创建密钥HKCU,您正尝试在其下打开密钥HKLM.
  4. RegEnumValue期望数据缓冲区的大小以字节为单位.你传递长度,字符数.
  5. 你正在混合Unicode文字和TCHAR.这毫无意义.您的代码不会针对MBCS编译,无论如何您不再关心Win98.停止使用TCHARwchar_t改为使用.
  6. lpValueName参数必须是可修改的缓冲区.你传了一个文字.请记住,此函数枚举值.它不会像您期望的那样读取特定的命名值.
  7. lpcchValueName参数包含以lpcchValue字符形式传递的缓冲区大小.传递数据缓冲区的长度.
  8. 返回的数据可能不会以空值终止.您必须按照文档中的说明进行防范.
  9. 对于忽略其参数的C程序,正确的mainint main(void).

我希望有更多错误,但我不再关注这一点.我建议你花一些时间在文档上.