1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017 年 8 月 4 日 |
---|
#5 in #xp
97KB
2K SLoC
已废弃!不再工作!
由于这个提交 https://github.com/rust-lang/rust/commit/59855e0bbf0df22f39dbe39bc58ab5c978fb3765,这个 crate 已不再工作!
用法
将此添加到您的 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 二进制文件,例如,运行 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。