9个版本
使用旧的Rust 2015
0.2.2 | 2020年3月15日 |
---|---|
0.2.1 | 2019年12月25日 |
0.2.0 | 2019年10月30日 |
0.1.5 | 2019年10月22日 |
0.1.2 | 2017年8月9日 |
#4 in #xp
每月下载 22 次
用于 xpsupport-sys
95KB
2K SLoC
用法
将此内容添加到您的Cargo.toml中
[dependencies]
xpsupport = "0.2"
将此内容添加到您的crate根目录
extern crate xpsupport;
将 xpsupport::init();
添加到 fn main
中,例如
fn main()
{
xpsupport::init();
//...
}
对于MSVC工具链,您可以运行bat文件
@echo off
cd %cd%
set RUSTFLAGS=-Ctarget-feature=+crt-static -Clink-args=/subsystem:console,5.01
cargo build --target i686-pc-windows-msvc --release
cmd /k
它是如何工作的?
版本 0.2
的想法受 ctor 的启发。 xpsupport::init()
在 Rust stdlib 的任何初始化之前运行(由于 ctor 的问题 issue27, xpsupport::init()
在 fn main
中只是一个占位符)。它钩子 GetProcAddress
,并在 XP 或 Vista 上返回以下函数(大部分代码来自 wine
项目)
- AcquireSRWLockShared
- ReleaseSRWLockExclusive
- ReleaseSRWLockShared
- TryAcquireSRWLockExclusive
- TryAcquireSRWLockShared
- SleepConditionVariableSRW
- WakeAllConditionVariable
- WakeConditionVariable
外部API解决方案
一些第三方crate使用不支持XP的winapi,您可以尝试 YY-Thunks 来解决这个问题。下载 YY-Thunks-Binary,将其解压到某处,对于xp,我们使用x86二进制文件,例如,使用 E:\YY-Thunks-1.0.2.4-Beta-Binary\objs\x86\YY_Thunks_for_WinXP.obj
运行bat文件
@echo off
cd %cd%
set RUSTFLAGS=-Ctarget-feature=+crt-static -Clink-args=/subsystem:console,5.01 -Clink-args=E:\YY-Thunks-1.0.2.4-Beta-Binary\objs\x86\YY_Thunks_for_WinXP.obj
cargo build --target i686-pc-windows-msvc --release
cmd /k
只需运行bat文件即可。因为它使用obj文件进行链接,所以可能与mingw不兼容。
测试结果
测试代码 来自libstd/sync,只有 mpsc::stress_recv_timeout_shared
似乎死锁,其他都通过了!您可以考虑将 parking_lot crate 作为同步库,或者 spin,它们都支持XP。
没有运行时依赖
~180KB