我使用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())
}
我做错了什么?
答案 0 :(得分:1)
您的c
宏获得一个指向临时变量的指针。这会导致不确定的行为。