FileCreate的一些麻烦

时间:2019-09-06 22:04:40

标签: winapi rust

我使用winapi板条箱获取文件的句柄。但是当我尝试使用绝对文件路径时,我在编码等方面遇到麻烦。因此Windows总是返回错误3(找不到路径)。

当我尝试调试此问题时,我正在使用GetFullPathNameW来解析完整路径。 例如,像a.txt甚至\\a.txt这样的路径都能很好地工作,但是当我在解决之后使用像foo\\bar\\baaaaz.txt这样的路径时,会收到类似C:\Users\Path\To\Project\鋨 駨 foo\baaaaz.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()
    }
    };
}

应该打开文件句柄的方法

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())
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的c宏获得一个指向临时变量的指针。这会导致不确定的行为。