首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegOpenKeyExA继续返回无效参数

RegOpenKeyExA继续返回无效参数
EN

Stack Overflow用户
提问于 2016-08-01 18:12:26
回答 1查看 116关注 0票数 1

我试图使用winapi (0.2.8)advapi32 (0.2.0)板条箱来编辑与鼠标加速相关的注册表。每次我调用advapi32::RegOpenKeyExA时,程序都会崩溃,结果值被设置为INVALID_PARAMETER (87)。违规代码是:

代码语言:javascript
复制
fn switch_acceleration(values: HashMap<&str, &str>) {
    let mouse: LPCSTR = CString::new("Control Panel\\Mouse").unwrap().as_ptr();

    unsafe {
        let hkey: *mut HKEY = ptr::null_mut();
        let reg_open_result = advapi32::RegOpenKeyExA(HKEY_CURRENT_USER, mouse, 0 as u32, winnt::KEY_WRITE | winnt::KEY_WOW64_64KEY, hkey);
        println!("{}", reg_open_result);

        for (key, value) in &values {
            let setting = CString::new(*key).unwrap().as_ptr();
            let new_val = CString::new(*value).unwrap().as_ptr() as *const u8;
            advapi32::RegSetValueExA(*hkey, setting, 0, winnt::REG_SZ, new_val, (size_of_val(&new_val) as u32));
        }

        advapi32::RegCloseKey(*hkey);            
    }
}

我试图通过删除samDesired和/或用KEY_ACCESS_ALL替换KEY_WRITE来更改KEY_WRITE选项,并且尝试将注册表项替换为打开其他东西,但是无论尝试什么,我总是得到相同的错误代码。哪一个论点无效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-01 18:31:49

您的代码有两个问题:

  1. 底层的CString正在被释放,因为没有对它的引用。as_ptr返回一个原始指针,在原始指针中没有生命周期信息,所以Rust认为可以释放字符串。解决方案是在使用as_ptr之前给字符串命名(也在循环中): 让m=CString::new(“控制面板\鼠标”).unwrap();

请阅读尝试解决此问题的CString::as_ptr RFC的更新文档。

  1. 将空指针(href)作为out参数传递。必须将hkey的声明更改为 设mut hkey: HKEY = 0;

&mut hkey as *mut HKEY调用中使用advapi32::RegOpenKeyExA

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38705456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档