RegGetValue 与 RegQueryValueEx

问题描述 投票:0回答:1

我有一个别人编码的程序。它有一个函数 RegGetValue 用作:

 uFuncReturnValue = RegOpenKeyExA(  HKEY_LOCAL_MACHINE, 
                                acSubKey, 
                                NULL, 
                                KEY_READ | KEY_WRITE,
                                    &hRegistry
                                    ); 

  //Store signature of the disk in the first 32 bytes of structVal
 if( uFuncReturnValue != ERROR_SUCCESS )
            {
            printf("Unable to open registry with error %u\n", uFuncReturnValue);
            exit(EXIT_FAILURE);;
            }

uFuncReturnValue = RegGetValueA( hRegistry, 
                        NULL, 
                        "\\DosDevices\\C:",  
                        RRF_RT_REG_BINARY, 
                        NULL, 
                        (LPVOID)&structVal, 
                        &dwSize
                        );

此代码块在 Windows 7 上完美运行,但在 Windows XP(32 位)上运行时返回错误。由于 32 位 xp 没有 RegGetValue 函数,因此我尝试使用 RegQueryValueEX 但在向该函数传递参数时遇到问题。我认为应该使用类似的东西:

uFuncReturnValue = RegQueryValueExA ( hRegistry, 
                                  "\\DosDevices\\J:",
                                  NULL,
                                  NULL,
                                  (LPBYTE) &structVal,
                                  &dwSize
                                  );

但是这里出了点问题,因为代码编译成功,但是当我执行它时,我收到一条消息:

程序'(128) myProgram.exe: Native' 已退出,代码为 1 (0x1)。

有人可以帮我吗?

windows registry
1个回答
0
投票

与 RegQueryValueEx 等较低级别的 API 相比,RegGetValue Win32 API 提供了相对较高级别的接口,用于从 Windows 注册表读取值。 RegGetValue 还提供了一个更安全的接口,例如,保证返回的字符串正确地以 NUL 结尾。尽管如此,RegGetValue 仍然是一个 C 接口低级 API,需要程序员注意许多细节,并且针对它进行编程可能会导致容易出现错误的复杂代码。本文展示了如何构建方便、易于使用且不易误用的现代 C++ 接口来隐藏 RegGetValue API 的复杂性,同时简化对 Windows 注册表的访问。此外,RegEnumValue API 被封装在一个方便的高级 C++ 函数中,用于枚举给定注册表项下的所有值。

© www.soinside.com 2019 - 2024. All rights reserved.