winapi-rs中无法解析lmjoin及NetGetJoinInformation问题求助
解决Rust中winapi-rs调用NetGetJoinInformation的编译错误
问题根源
winapi crate采用按需启用模块的设计,你当前仅启用了winuser feature,而包含NetGetJoinInformation和NETSETUP_JOIN_STATUS相关类型的lmjoin模块并未被启用;同时你对PNETSETUP_JOIN_STATUS的导入路径也不正确。
修复步骤
1. 更新Cargo.toml配置
添加lmjoin feature到winapi的依赖配置中:
[package] name = "foo" version = "0.1.0" edition = "2021" [dependencies] winapi = {version="0.3.9", features=["winuser", "lmjoin"]}
2. 修正代码中的导入和类型使用
PNETSETUP_JOIN_STATUS是NETSETUP_JOIN_STATUS的指针类型,属于lmjoin模块下的类型,需调整导入路径;同时注意参数传递的正确性,以及后续内存释放的处理:
use winapi::um::lmjoin::{NetGetJoinInformation, NETSETUP_JOIN_STATUS, PNETSETUP_JOIN_STATUS}; use winapi::um::winnt::LPWSTR; use winapi::um::winnt::LPCWSTR; use winapi::um::lmapi::NetApiBufferFree; // 用于释放返回的域名内存 fn foo() { let lp_server: LPCWSTR = std::ptr::null(); let mut domain_name: LPWSTR = std::ptr::null_mut(); let mut join_status: NETSETUP_JOIN_STATUS = 0; // 调用winapi函数必须使用unsafe块 let status = unsafe { NetGetJoinInformation(lp_server, &mut domain_name, &mut join_status) }; // 成功获取域名后,必须调用NetApiBufferFree释放内存,避免泄漏 if status == 0 && !domain_name.is_null() { unsafe { NetApiBufferFree(domain_name as *mut _); } } }
额外说明
lmjoinfeature启用后,winapi会加载lmjoin.h对应的所有类型和函数定义;PNETSETUP_JOIN_STATUS本质是*mut NETSETUP_JOIN_STATUS,你也可以直接使用*mut NETSETUP_JOIN_STATUS替代,无需单独导入该类型;- 所有winapi的系统调用都必须包裹在
unsafe块中,因为Rust无法保证这些外部函数的内存安全性。
内容的提问来源于stack exchange,提问作者W00dy
相关产品推荐
相关产品推荐

