Winapi FileCreate的一些问题
我使用winapi板条箱来处理文件。但当我尝试使用绝对文件路径时,我在编码或类似的问题上遇到了麻烦。因此windows总是返回错误3(未找到路径) 当我试图调试这个问题时,我使用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 扩展字符串
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())
}