小编Emi*_*ags的帖子

HKEY_LOCAL_MACHINE上的RegOpenKeyEx失败

嗨,我正在尝试读取一个注册表值,它给我firefox.exe的路径.这存储在

HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 3.0.10\bin
Run Code Online (Sandbox Code Playgroud)

(版本号可以在其他地方找到)

但我似乎无法让RegOpenKeyEx返回ERROR_SUCCESS

HKEY_LOCAL_MACHINE
Run Code Online (Sandbox Code Playgroud)

所以这个测试失败了:

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("\\SOFTWARE"),0,KEY_QUERY_VALUE,&keyHandle) == ERROR_SUCCESS)
Run Code Online (Sandbox Code Playgroud)

而这个测试通过:

if(RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT("\\Shell"),0,KEY_QUERY_VALUE,&keyHandle) == ERROR_SUCCESS)
Run Code Online (Sandbox Code Playgroud)

c++ registry winapi

6
推荐指数
1
解决办法
3万
查看次数

将std :: string转换为const BYTE*for RegSetValueEx()

我有一个获取std :: string的函数.那个函数调用

函数RegSetValueEx

第五个参数是注册表值的值,并期望一个const BYTE*类型的变量.所以我必须将std :: string转换为const BYTE*,并将结果数组的长度作为第6个参数.

我找到了一种方法,但它感觉很难看,我真的不明白发生了什么.这是该功能的精简版:

void function(const std::string& newValue)
{
    HKEY keyHandle;
    if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS)
    {
        std::wstring wNewValue;
        wNewValue.assign(newValue.begin(),newValue.end());

        if (RegSetValueEx(keyHandle, TEXT("some value"), NULL, REG_SZ, (const BYTE*)(LPCTSTR)(wNewValue.c_str()), wNewValue.size()*2)==ERROR_SUCCESS)
        {
            //do something
        }
        RegCloseKey(keyHandle);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我首先创建一个宽字符串(定义了UNICODE),然后使用双重转换,并且对于长度我必须做*2,否则它只会设置输入字符串的一半.

这种形式的演员是正常/最好的方式吗?

为什么*2,会有什么更好的方法?

c++ windows registry winapi stl

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

c++ ×2

registry ×2

winapi ×2

stl ×1

windows ×1