gpt4 book ai didi

winapi - 使用 CString 时,使用 winapi 将 &str 写入控制台出错

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

我想使用 WriteConsoleOutputAttribute 向控制台写入一个 &str来自 the winapi crate .我只有一个 u8 数组,它将从结构的 std::io::Write 实现传递到我的 winapi 代码。

以下内容无法正常工作,因为我看到的是彩色单元格而不是文本。

use std::ffi::CString;
use std::str;
use winapi::um::wincon::{
GetConsoleScreenBufferInfo, WriteConsoleOutputAttribute, CONSOLE_SCREEN_BUFFER_INFO, COORD,
};
use winapi::um::winnt::HANDLE;

pub fn write_char_buffer(handle: HANDLE, buf: &[u8]) {
// get buffer info
let csbi = get_console_screen_buffer_info();

// get string from u8[] and parse it to an c_str
let data = str::from_utf8(buf).unwrap();
let c_str = CString::new(data).unwrap();
let ptr: *const u16 = (c_str.as_ptr() as *const u16);

// get current position
let current_pos = COORD {
X: csbi.dwCursorPosition.X,
Y: csbi.dwCursorPosition.Y,
};

let mut cells_written: u32 = 0;

// write to console
unsafe {
WriteConsoleOutputAttribute(
handle,
ptr,
data.len() as u32,
current_pos,
&mut cells_written,
);
}
}

pub fn get_console_screen_buffer_info() -> CONSOLE_SCREEN_BUFFER_INFO {
let output_handle = get_output_handle();
let mut csbi = CONSOLE_SCREEN_BUFFER_INFO::empty();
let success;

unsafe { success = GetConsoleScreenBufferInfo(output_handle, &mut csbi) }

if success == 0 {
panic!("Cannot get console screen buffer info");
}

csbi
}

我认为 CString 和指针出了问题。看这个link对于代码。

Update

Rust 字符串是 utf8 而 winapi 字符串是 utf16。所以我将 utf8 数组转换为 utf16 字符串,但显示了相同的输出,只是控制台中没有文本的彩色单元格:

let utf8 = str::from_utf8(buf).unwrap();
let utf16: Vec<u16> = utf8.encode_utf16().collect();
let utf_string = String::from_utf16(&utf16).unwrap();
let c_str = CString::new(utf_string).unwrap();

最佳答案

I want to write a &str to the console using WriteConsoleOutputAttribute

那不是那个函数的作用。 WriteConsoleOutputAttribute 设置字符属性:背景颜色、前景色、下划线等。 This page有一个(更多)完整列表。

要将文本写入控制台,请在将其转换为 UTF-16 后使用 WriteConsoleOutputCharacter

关于winapi - 使用 CString 时,使用 winapi 将 &str 写入控制台出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50993911/

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