如何使用把手防止窗户生锈

  • 本文关键字:窗户 何使用 windows-rs
  • 更新时间 :
  • 英文 :


我正试图在std::fs:File上调用LockFileEx,但由于类型HANDLE有多个实现,所以很吃力:

windows::Win32::Foundation::HANDLE
std::os::windows::io::BorrowedHandle
std::os::windows::raw::HANDLE

我目前的尝试如下:

fn unsafe lock(file: &mut File) -> BOOL {
let mut overlapped = std::mem::zeroed();
LockFileEx(
file.as_handle(),
LOCKFILE_EXCLUSIVE_LOCK,
0,
!0,
!0
&mut overlapped)
}

失败

the trait `From<BorrowedHandler<'_>>` is not implemented for `HANDLE`

由于HANDLE类型不同,我有点困惑,想知道如何将它们组合在一起。

Windows中的HANDLE是标识内核对象的名字对象。其原生类型为void*,其价值不具有内在意义。它的唯一目的是引用与操作系统通信的对象,任何需要与操作系统交互的库(如Rust的标准库(都将提供一种表示HANDLE值的方法。

在ABI,在橡胶与道路交汇的地方,所有库(必须(就特定的数据类型(或者至少是二进制布局兼容的类型(达成一致,然而Rust的类型系统为编码环境信息留下了很大的空间:

  • std::os::windows::raw::HANDLE是低级别的ABI兼容类型别名。它实际上只是一个*mut c_void,Rust表达C的void*的方式
  • CCD_ 11是具有生存期注释的上述CCD_ 13类型之上的CCD_。只要引用的File存在,它就有效。
    它刚刚登陆Rust 1.63,所以没有太多真实世界的证据表明这是怎么回事
  • windows::Win32::Foundation::HANDLEstd::od::windows::raw::HANDLE非常相似,因为它透明地包装void*,但将其存储为isize

虽然已经讨论了windowsHANDLE是否应该遵循寿命标注的BorrowedHandle的路线,但这一点尚未实现(截至0.39.0(。此时,最简单的解决方案是取出as_raw_handle()并将其输入HANDLE,例如:

unsafe fn lock(file: &mut File) -> BOOL {
let mut overlapped = Default::default();
LockFileEx(
HANDLE(file.as_raw_handle() as isize),
LOCKFILE_EXCLUSIVE_LOCK,
0,
!0,
!0,
&mut overlapped,
)
}

对于特定的错误诊断,LockFileEx的功能签名为:

pub unsafe fn LockFileEx<'a, P0>(
hfile: P0,
dwflags: LOCK_FILE_FLAGS,
dwreserved: u32,
nnumberofbytestolocklow: u32,
nnumberofbytestolockhigh: u32,
lpoverlapped: *mut OVERLAPPED
) -> BOOL where
P0: Into<HANDLE>,

rustc正试图对hfile参数调用Into(或From(特征实现,但找不到匹配的实现。这是因为它不存在,而不仅仅是因为调用者未能use特定的特性实现。

最新更新