我试图使用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);
}
}我试图通过删除samDesired和/或用KEY_ACCESS_ALL替换KEY_WRITE来更改KEY_WRITE选项,并且尝试将注册表项替换为打开其他东西,但是无论尝试什么,我总是得到相同的错误代码。哪一个论点无效?
发布于 2016-08-01 18:31:49
您的代码有两个问题:
CString正在被释放,因为没有对它的引用。as_ptr返回一个原始指针,在原始指针中没有生命周期信息,所以Rust认为可以释放字符串。解决方案是在使用as_ptr之前给字符串命名(也在循环中):
让m=CString::new(“控制面板\鼠标”).unwrap();请阅读尝试解决此问题的CString::as_ptr和这 RFC的更新文档。
href)作为out参数传递。必须将hkey的声明更改为
设mut hkey: HKEY = 0;在&mut hkey as *mut HKEY调用中使用advapi32::RegOpenKeyExA。
https://stackoverflow.com/questions/38705456
复制相似问题