2016-08-01 49 views
1

我正在尝试使用winapi (0.2.8)advapi32 (0.2.0)箱子来编辑有关鼠标加速的注册表。每次我拨打advapi32::RegOpenKeyExA程序崩溃,结果值设置为INVALID_PARAMETER (87)。有问题的代码是:RegOpenKeyExA保持返回无效的参数

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_ACCESS_ALL更换KEY_WRITE改变samDesired选项,我曾尝试更换注册表项开到别的东西,但是我总是得到同样的错误代码无论我尝试什么。哪一个论点是无效的?

回答

2

有两个问题与您的代码:

  1. 底层CString被释放因为它没有提及。 as_ptr返回一个原始指针,在原始指针中没有生命期的信息,所以Rust认为可以释放该字符串。该解决方案是使用as_ptr(也环内)之前来命名字符串:

    let m = CString::new("Control Panel\\Mouse").unwrap(); 
    let mouse: LPCSTR = m.as_ptr(); 
    

请阅读最新的文档为CString::as_ptrthis RFC,试图解决这个问题。

  1. 您正在传递空指针(href)作为out参数。你必须在advapi32::RegOpenKeyExA通话hkey申报改为

    let mut hkey: HKEY = 0; 
    

为使用&mut hkey as *mut HKEY

+0

*将空指针作为out参数传递似乎很奇怪* - 这是真实的,但有时您将* reference *作为参数传递给空指针。然后函数可以这样分配和返回指针。 – Shepmaster