【问题标题】:How to read a "wide" string into a buffer? [duplicate]如何将“宽”字符串读入缓冲区? [复制]
【发布时间】:2018-10-07 21:39:57
【问题描述】:

Windows API 具有类似GetWindowTextW 的函数,可将字符串读入您提供的缓冲区。如何提供这样的缓冲区,然后在 Rust 中从中读取字符串?

附: 与此问题Calling the GetUserName WinAPI function with a mutable string doesn't populate the string 相比,此问题一般侧重于 Windows 上的字符串读取,而不是特定问题。此外,这个问题有望通过关键字轻松搜索到,回答所要求的内容。

【问题讨论】:

  • @IInspectable 我真的不明白。这个问题怎么能被认为与“使用可变字符串调用 GetUserName WinAPI 函数不会填充字符串”相同?另一个标题与这里的问题无关。只有一半的答案代码是相似的。我提出了两个问题并明确给出了答案,以使其易于查找和使用。
  • 本题与重复题没有本质区别。两者都尝试使用等效接口访问 Windows API,这些接口由指向缓冲区/缓冲区对大小的指针组成。如果你想提供一个规范的问答,你应该问一个通用的问题:你如何调用一个将字符串返回到调用者提供的缓冲区的 C API?如果您坚持认为这不是重复的,请解释实质性差异。
  • 另请注意,重复意味着在回答此问题的另一个问题中有答案,重复并不意味着您的问题与另一个问题完全相同。 “这个问题在这里已经有了答案”而不是“这个问题已经在这里被问过了”
  • 好吧,正如你所说。但是我在谷歌上搜索这个问题时遇到了严重的麻烦,花了两个多小时打开多个选项卡和 SO 问题,试验代码,遍历 stdlib 代码等。“调用 GetUserName WinAPI .... 不填充字符串”只是没有'不说话,合我的口味。可能是我理解的问题。
  • @VasyaNovikov 这就是为什么 SO 有重复的原因。此问题现在将显示在搜索您使用的术语中,并将人们重定向到现有答案。这避免了答案的碎片化,同时仍然提高了可搜索性。

标签: winapi rust widestring


【解决方案1】:

例子:

#[cfg(target_os = "windows")]
fn get_window_name(max_size: i32) -> String {
    let mut vec = Vec::with_capacity(max_size as usize);
    unsafe {
        let hwnd = user32::GetForegroundWindow();
        let err_code = user32::GetWindowTextW(hwnd, vec.as_mut_ptr(), max_size);
        assert!(err_code != 0);
        assert!(vec.capacity() >= max_size as usize);
        vec.set_len(max_size as usize);
    };
    String::from_utf16(&vec).unwrap()
}

解决方案取自Calling the GetUserName WinAPI function with a mutable string doesn't populate the string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2012-07-17
    • 2022-11-12
    • 2013-01-16
    • 2012-11-17
    • 2015-10-29
    相关资源
    最近更新 更多