gpt4 book ai didi

winapi - FileCreate 的一些问题

转载 作者:行者123 更新时间:2023-11-29 08:28:27 24 4
gpt4 key购买 nike

我使用 winapi crate 来获取文件的句柄。但是当我尝试使用绝对文件路径时,我遇到了编码或类似问题。所以 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())
}

我做错了什么?

最佳答案

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

关于winapi - FileCreate 的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57829001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com