在Rust中调用NetUseAdd时如何将USE_INFO_2结构体转为裸指针?
解决windows.rs调用NetUseAdd的类型错误问题
错误原因
NetUseAdd函数的第三个参数要求传入指向USE_INFO_2结构体的裸指针,而非结构体本身,原代码直接传入结构体实例导致类型不匹配。
修正后的代码
let mut parm_err: u32 = 0; let remote_path = conver_pwstr("//WIN-HDOB90189BJ/Users/test/Desktop/share"); let password = conver_pwstr("test"); let username = conver_pwstr("test"); let mut use_info: USE_INFO_2 = USE_INFO_2::default(); use_info.ui2_remote = remote_path; // 必须指定远程共享路径 use_info.ui2_username = username; use_info.ui2_password = password; let level: u32 = 2; let status = NetUseAdd( None, level, // 将USE_INFO_2转换为函数要求的void指针 &mut use_info as *mut USE_INFO_2 as *const _, // 传入参数错误信息的指针,不需要可替换为std::ptr::null_mut() &mut parm_err as *mut _ ); // 检查调用结果 if status != NET_API_STATUS::NERR_Success { eprintln!("网络连接创建失败,错误码: {:?},参数错误索引: {}", status, parm_err); } }
关键修改点
- 指针转换:通过
&mut use_info as *mut USE_INFO_2 as *const _将结构体实例转换为NetUseAdd要求的*const c_void类型指针。 - 参数修正:原代码中
parm_err的Option<*mut u32>不符合函数签名,直接传入变量的裸指针即可;若不需要参数错误信息,可传入std::ptr::null_mut()。 - 补全必填字段:USE_INFO_2的
ui2_remote是必填项,必须指定要连接的远程共享路径,否则调用会失败。
内容的提问来源于stack exchange,提问作者muteb
相关产品推荐
相关产品推荐

