Открытие файла в Rust с помощью Windows API - PullRequest
0 голосов
/ 11 октября 2019
let mut file = OpenFile(dll_path.as_bytes_with_nul().as_ptr() as _, &mut ofstruct, 0) as *mut c_void;
let mut buffer_read: LPVOID = std::ptr::null_mut();

ReadFile(file, buffer_read, 5, std::ptr::null_mut(), std::ptr::null_mut());

println!("{:?}", buffer_read.is_null());

У меня проблемы с поиском правильных типов для buffer_read, оно всегда равно нулю.

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

То, что вы можете просто ссылаться на Windows C файл API в Rust, не означает, что вы должны это делать. В частности, это отнимает у вас целую кучу мер безопасности, предоставляемых самим языком, и ошибок, допущенных вами.

В частности, ваш код в настоящее время имеет UB, передавая NULL последним двум параметрам *Одновременно 1008 * является явным предупреждением:

lpNumberOfBytesRead

Указатель на переменную, которая получает число прочитанных байтов при использовании синхронного параметра hFile,ReadFile устанавливает это значение на ноль, прежде чем выполнять какую-либо работу или проверку ошибок. Используйте NULL для этого параметра, если это асинхронная операция, чтобы избежать потенциально ошибочных результатов.

Этот параметр может быть NULL, только если параметр lpOverlapped не равен NULL.

В вашем случае, идиоматический способ сделать это безопасно следующий:

let mut buffer_read = vec![0, 5];
let fhandle = std::fs::File::open("path/to/your/file")?;
fhandle.read_exact(&mut buffer_read)?;
println!("{}", String::from_utf8(buffer_read));
0 голосов
/ 11 октября 2019

Я понял это.

let mut buffer_read = vec![0; 5];

ReadFile(file, buffer_read.as_mut_ptr() as _, 5, std::ptr::null_mut(), std::ptr::null_mut());
println!("{}", String::from_utf8(buffer_read));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...