2016-08-01 98 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