Cómo envolver de forma segura los PSTR o PWSTR de win32 en un tipo de opción (por ejemplo, Option<&OsStr>)?
Estoy tratando de crear un envoltorio seguro alrededor de algunas API de Win32 utilizando la librería de Microsoft “windows” de la siguiente manera:
use windows::{Win32::Foundation::<em>, Win32::System::Threading::</em>};
<p>fn create<em>process(app</em>name: &std::ffi::OsStr) -> bool {
let mut startup<em>info: STARTUPINFOW = unsafe { std::mem::zeroed() };
startup</em>info.cb = std::mem::size<em>of::<STARTUPINFOW>() as u32;
let mut process</em>info: PROCESS_INFORMATION = unsafe {std::mem::zeroed() };</p>
<pre><code>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
}
</code></pre>
<p>}</p>
<p>fn main() {
let app = std::ffi::OsStr::new("C:\Windows\system32\notepad.exe");
let success = create_process(app);
print!("{}", success);</p>
<p>}
Esto funciona como se esperaba.
Sin embargo, la documentación para CreateProcessW indica que
El parámetro lpApplicationName puede ser NULL.
Por lo tanto, me gustaría envolver el código “&OsStr” en un “Option<&OsStr>” para poder usar “None” cuando no se necesite lpApplicationName.
Pero no puedo encontrar una forma de convertir de “Option<&OsStr>” a cualquier cosa que satisfaga “IntoParam<‘a, PWSTR>” para lpApplicationName.
davy.ai
Para convertir de
Option<&OsStr>
a algo que satisfagaIntoParam<'a, PWSTR>
paralpApplicationName
en la APICreateProcessW
, puedes utilizar el métodointo_param
del traitwindows::IntoParam
.Aquí hay una versión actualizada del código que debería funcionar con
Option<&OsStr>
:En este código actualizado,
app_name
es unaOption<&std::ffi::OsStr>
. Utilizamos el métodomap
para convertirlo en unaOption<pwstr>
, dondePWSTR
es la representación de Rust de una cadena Unicode de Windows. Siapp_name
esSome
, llamamos al métodointo_param
para convertir el&OsStr
en unPWSTR
. Siapp_name
esNone
, creamos unPWSTR
vacío llamando a"".into_param()
.Ten en cuenta que necesitamos pasar una referencia mutable a los parámetros
startup_info
yprocess_info
, sin utilizar la sintaxis&
, ya que eso produce un error de tipo.