2016-08-01 5 views
1

マウスアクセラレーションに関連するレジストリを編集するのにwinapi (0.2.8)advapi32 (0.2.0)のクレートを使用しようとしています。私がadvapi32::RegOpenKeyExAと呼ぶたびに、プログラムはクラッシュし、結果の値はINVALID_PARAMETER (87)に設定されます。問題のコードは次のとおりです。私はKEY_WOW_64の除去および/またはKEY_ACCESS_ALLKEY_WRITEを置き換えることにより、samDesiredオプションを変更しようとしていると私はしかし、私はいつも同じエラーを取得する何か他のものに開くようにレジストリキーを交換しようとしている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);    
    } 
} 

私が何を試してもコード。どちらの引数が無効ですか?

答えて

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. outパラメータとしてヌルポインタ(href)を渡しています。あなたはadvapi32::RegOpenKeyExA呼び出しで使用&mut hkey as *mut HKEYとしてhkey

  2. let mut hkey: HKEY = 0; 
    

の宣言を変更する必要があります。

+0

* outパラメータとしてnullポインタを渡すのは奇妙に思えます* - これは当てはまりますが、パラメータとしてnull参照に*参照*を渡すことがあります。次に、関数はそのようにポインタを割り当てて返します。 – Shepmaster

関連する問題