gpt4 book ai didi

rust - RegOpenKeyEx 不断返回无效参数

转载 作者:行者123 更新时间:2023-11-29 08:16:39 30 4
gpt4 key购买 nike

我正在尝试使用 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 选项,并且我尝试替换注册表项打开其他东西,但是无论我尝试什么,我总是得到相同的错误代码。哪一个参数是无效的?

最佳答案

您的代码有两个问题:

  1. 底层 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。

  1. 您正在传递一个空指针 (href) 作为输出参数。您必须将 hkey 的声明更改为

    let mut hkey: HKEY = 0;

advapi32::RegOpenKeyExA 调用中使用 &mut hkey 作为 *mut HKEY

关于rust - RegOpenKeyEx 不断返回无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38705456/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com