我正在尝试使用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/