我正试图使用微软的windows crate为一些Win32 API创建一个安全的包装器,比如:
use windows::{Win32::Foundation::*, Win32::System::Threading::*};
fn create_process(app_name: &std::ffi::OsStr) -> bool {
let mut startup_info: STARTUPINFOW = unsafe { std::mem::zeroed() };
startup_info.cb = std::mem::size_of::<STARTUPINFOW>() as u32;
let mut process_info: PROCESS_INFORMATION = unsafe {std::mem::zeroed() };
unsafe {
let success = CreateProcessW(
app_name, // lpapplicationname
None, // lpcommandname
std::ptr::null(), // lpprocessattributes
std::ptr::null(), // lpthreadattributes
true, // binherithandles
CREATE_SUSPENDED, // dwcreationflags
std::ptr::null(), // lpenvironment
&startup_info, // lpstartupinfo
&mut process_info // lpprocessinformation
).as_bool();
success
}
}
fn main() {
let app = std::ffi::OsStr::new("C:\Windows\system32\notepad.exe");
let success = create_process(app);
print!("{}", success);
}
这是意料之中的事。
但是,CreateProcessW的文档指出
lpApplicationName参数可以为NULL。
因此,我想将&OsStr
封装在Option<&OsStr>
中,以便在不需要lpApplicationName时使用None
。
但是,对于lpApplicationName,我找不到从Option<&OsStr>
转换为满足IntoParam<'a, PWSTR>
的任何内容的方法。
自#1801起,&OsStr
应实现IntoParam<PWSTR>
。由于null()
也实现了它,您应该能够编写:
use windows::core::{IntoParam, Param};
let app_name_param: Param<'_, PWSTR> = if let Some(app_name) = app_name {
app_name.into_param()
} else {
Param::None
};
并通过CCD_ 9到CCD_。
(我不能测试这个,因为我在Linux上运行,由于需要std::os::windows::ffi::OsStrExt
,Foundation/mod.rs
无法编译。(