如何安全地将win32的PSTR或PWSTR包装在选项类型中(例如Option<&OsStr>)?



我正试图使用微软的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::OsStrExtFoundation/mod.rs无法编译。(

相关内容

  • 没有找到相关文章

最新更新