Winapi FileCreate的一些问题

Winapi FileCreate的一些问题,winapi,rust,Winapi,Rust,我使用winapi板条箱来处理文件。但当我尝试使用绝对文件路径时,我在编码或类似的问题上遇到了麻烦。因此windows总是返回错误3(未找到路径) 当我试图调试这个问题时,我使用GetFullPathNameW来解析完整路径。 例如,像a.txt这样的路径,甚至像\\a.txt这样的路径都能很好地工作,但是当我使用像foo\\bar\\baaaz.txt这样的路径时,在解析它之后,我会收到像C:\Users\path\To\Project>这样的消息\鋨 駨foo\baaaz.txt 扩展字符串

我使用winapi板条箱来处理文件。但当我尝试使用绝对文件路径时,我在编码或类似的问题上遇到了麻烦。因此windows总是返回错误3(未找到路径)

当我试图调试这个问题时,我使用
GetFullPathNameW
来解析完整路径。 例如,像
a.txt
这样的路径,甚至像
\\a.txt
这样的路径都能很好地工作,但是当我使用像
foo\\bar\\baaaz.txt这样的路径时,在解析它之后,我会收到像
C:\Users\path\To\Project>这样的消息\鋨駨foo\baaaz.txt

扩展字符串的宏

macro_rules! c {
    ($str: expr) => {
        unsafe {
        let v: Vec<u16> = OsStr::new($str).encode_wide().chain(Some(0).into_iter()).collect();
        v.as_ptr()
    }
    };
}

我做错了什么?

您的
c
宏获取指向临时变量的指针。这会导致未定义的行为

fn open_file_handle(name: &str) -> Result<HANDLE, u32> {


    let handle: HANDLE = unsafe {
        CreateFileW(
            c!(name),
            FILE_READ_ATTRIBUTES | FILE_READ_DATA | SYNCHRONIZE,
            FILE_SHARE_READ,
            NULL as LPSECURITY_ATTRIBUTES,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL
        )
    };

   if handle == INVALID_HANDLE_VALUE {
       let error = unsafe { GetLastError() };
       Err(error)
   } else {
       Ok(handle)
   }

fn resolve(name: &str) -> String {

   unsafe {
       let result = GetFullPathNameW(
            c!(name),
            512,
            buffer.as_mut_ptr(),
            NULL as *mut LPWSTR
        );
       buffer.set_len(result as usize);
    }

    String::from_utf16_lossy(buffer.as_slice())
}