【问题标题】:Why does a LoadCursorA call give a build error?为什么 LoadCursorA 调用会产生构建错误?
【发布时间】:2021-11-22 22:06:28
【问题描述】:

为什么在使用 rust Crate for Windows 时,LoadCursorA 调用不会生成“特征实现”构建错误?

#[allow(dead_code)]
use windows::Win32::UI::WindowsAndMessaging::LoadCursorA;
use windows::Win32::UI::WindowsAndMessaging::IDC_ARROW;

fn main() {
    unsafe {
        let _h_cursor = LoadCursorA(None, IDC_ARROW);
        //let _h_cursor = LoadCursorA(None, &IDC_ARROW);
    };
}

error[E0277]: trait bound PWSTR: IntoParam<'_, PSTR> 不满足

【问题讨论】:

  • 你也可以粘贴编译器错误吗?
  • 因为IDC_ARROW is a PWSTR等不能与…A函数一起使用,这需要PSTR
  • 可以修改 LoadCursorA 调用以构建,如果可以,如何?谢谢。
  • IDC_* 常量并不是真正的指针,而是伪装成指针的短整数常量,所以你应该安全地使用IDC_ARROW as PSTR
  • 尝试 IDC_ARROW 作为 PSTR 会出现错误 [E0605] 非原始类型转换:PWSTR as PSTR

标签: windows rust


【解决方案1】:

IDC_ARROW 不能和LoadCursorA 一起工作的原因是因为it is a PWSTR,所以它只能和…W 函数一起工作。 …A 中的函数需要 PSTR

但是IDC_ARROW 并不是真正的PWSTR(即“指向宽字符串的指针”)。它只是伪装成PWSTR 的一个小常量,所以我们可以将其转换为PSTR 并将其传递给LoadCursorA

#[allow(dead_code)]
use windows::Win32::UI::WindowsAndMessaging::LoadCursorA;
use windows::Win32::UI::WindowsAndMessaging::IDC_ARROW;

fn main() {
    unsafe {
        let _h_cursor = LoadCursorA(None, PSTR(IDC_ARROW.0 as _));
    };
}

当然,另一种选择就是使用LoadCursorW

#[allow(dead_code)]
use windows::Win32::UI::WindowsAndMessaging::LoadCursorW;
use windows::Win32::UI::WindowsAndMessaging::IDC_ARROW;

fn main() {
    unsafe {
        let _h_cursor = LoadCursorW(None, IDC_ARROW);
    };
}

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多