#variant #com #winapi #codec #windows

variant-rs

为 Rust 提供的 VARIANT 支持。对 WinAPI/COM 结果进行整洁、惯用的处理。

6 个版本 (3 个重大更新)

0.4.0 2024 年 2 月 2 日
0.3.1 2023 年 4 月 29 日
0.2.1 2023 年 1 月 13 日
0.1.0 2022 年 7 月 13 日

#327 in 数据结构

Download history 43/week @ 2024-04-15 12/week @ 2024-04-22 6/week @ 2024-04-29 175/week @ 2024-05-06 286/week @ 2024-05-13 475/week @ 2024-05-20 458/week @ 2024-05-27 410/week @ 2024-06-03 433/week @ 2024-06-10 268/week @ 2024-06-17 325/week @ 2024-06-24 344/week @ 2024-07-01 326/week @ 2024-07-08 335/week @ 2024-07-15 275/week @ 2024-07-22

每月下载量 1,280
用于 inline-vbs

MIT 许可证

42KB
947 代码行

variant-rs

Crates.io Crates.io License License

variant-rs 是一个 Rust crate,它提供了对 COM VARIANT 类型的惯用处理。Rust 默认支持判别联合类型,因此尽管 VARIANT 通常很难处理,但 Rust 使编码和解码变得容易。

该 crate 设计与 winapi crate 中的 VARIANT 类型一起工作。

基本用法

use variant_rs::*;

fn main() {
    let v1 = Variant::I32(123); // manual instanciation
    let v2 = 123i32.to_variant(); // ToVariant trait
    let v3 = 123.into(); // From / Into traits
    assert_eq!(v1, v2);
    assert_eq!(v1, v3);
  
    let bstr: Variant = "Hello, world!".into();
    let ptr: VARIANT = bstr.clone().try_into().unwrap(); // convert to COM VARIANT
    let back: Variant = ptr.try_into().unwrap(); // convert back
    assert_eq!(bstr, back);
}

支持的 VARIANT 类型及其对应类型

VARIANT 类型 Rust 类型 Rust 类型 (BY_REF)
VT_EMPTY () N/A
VT_NULL () N/A
VT_I1 i8 PSTR
VT_I2 i16 &'static mut i16
VT_I4 i32 &'static mut i32
VT_I8 i64 &'static mut i64
VT_UI1 u8 &'static mut u8
VT_UI2 u16 &'static mut u16
VT_UI4 u32 &'static mut u32
VT_UI8 u64 &'static mut u64
VT_INT i32 &'static mut i32
VT_UINT u32 &'static mut u32
VT_R4 f32 &'static mut f32
VT_R8 f64 &'static mut f64
VT_BOOL bool &'static mutComBool
VT_BSTR BSTR &'static mut BSTR
VT_ERROR HRESULT (i32) i16-backed enum.
VT_CY Currency &'static mutComCurrency
VT_DATE NaiveDateTime &'static mutComDate
VT_DECIMAL Decimal &'static mutComDecimal
VT_UNKNOWN Option<IUnknown> N/A
VT_DISPATCH Option<IDispatch> N/A
VT_VARIANT N/A PtrWrapper<VARIANT>

包装类型

ComBool

i16-backed enum.

ComCurrency

将 COM 的 i64 货币数据 CY 映射到 Decimal

ComDecimal

将 COM 的 96 位十进制数 DECIMAL 映射到 Decimal

ComData

将 COM 的 DATE(从 1899-12-30 开始的毫秒数 f64)映射到 NaiveDateTime

PtrWrapper

COM 接口指针的安全包装。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
variant-rs = "0.4.0"

许可证

本项目许可方式为以下之一

依赖项

~130MB
~2M SLoC