我正在尝试使用winapi (0.2.8)advapi32 (0.2.0)条板箱来编辑与鼠标加速有关的注册表。每次我调用advapi32::RegOpenKeyExA时,程序崩溃,结果值设置为INVALID_PARAMETER (87)。令人反感的代码是:

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);
    }
}

我尝试通过删除KEY_WOW_64和/或用KEY_WRITE替换KEY_ACCESS_ALL来更改samDesired选项,并且尝试替换注册表项以打开其他内容,但是无论我如何尝试,我总是会得到相同的错误代码。哪一个参数无效?

最佳答案

您的代码有两个问题:

  • 因为没有对底层CString的引用,所以正在对其进行释放。 as_ptr返回一个原始指针,原始指针中没有生存期的信息,因此Rust认为取消分配字符串是可以的。解决方案是在使用as_ptr之前(也在循环内)命名字符串:
    let m = CString::new("Control Panel\\Mouse").unwrap();
    let mouse: LPCSTR = m.as_ptr();
    

  • 请阅读 CString::as_ptr this RFC的更新文档,以尝试解决此问题。
  • 您将传递空指针(href)作为out参数。您必须将hkey的声明更改为
    let mut hkey: HKEY = 0;
    

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

    关于rust - RegOpenKeyExA不断返回无效的参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38705456/

    10-10 18:32