在讨论/学习了从 Rust 调用 Windows-API 的 FFI 的正确方法之后,我进一步研究了它,并想仔细检查我的理解。
我有一个被调用两次的 Windows API。在第一次调用中,它返回实际输出参数所需的缓冲区大小。然后,使用足够大小的缓冲区第二次调用它。我目前正在使用 aVec作为此缓冲区的数据类型(请参见下面的示例)。
该代码可以工作,但我想知道这是否是正确的方法,或者是否最好利用一个函数,例如alloc::heap::allocate直接保留一些内存,然后用于 transmute将 FFI 的结果转换回来。同样,我的代码可以工作,但我试图在幕后了解一下。
extern crate advapi32;
extern crate winapi;
extern crate widestring;
use widestring::WideCString;
use std::io::Error as IOError;
use winapi::winnt;
fn main() {
let mut lp_buffer: Vec<winnt::WCHAR> = Vec::new();
let mut pcb_buffer: winapi::DWORD = 0;
let rtrn_bool = unsafe {
advapi32::GetUserNameW(lp_buffer.as_mut_ptr(),
&mut pcb_buffer )
};
if rtrn_bool == 0 {
match IOError::last_os_error().raw_os_error() {
Some(122) => {
// Resizing the buffers sizes …Run Code Online (Sandbox Code Playgroud)