在Rust中读取Iracing模拟器创建的共享内存映射文件
解决Windows下Rust读取iRacing共享内存的问题
核心概念澄清
你之前对memmap2的理解有误——它完全支持跨进程访问Windows的命名内存映射文件(也就是iRacing提供的共享内存)。Windows的共享内存本质是通过内核对象命名的内存映射,memmap2在Windows平台封装了对应的系统API,可以直接打开已有的命名映射。
方案1:使用memmap2实现(推荐)
以下代码可以复现你Python示例的功能,读取iRacing的共享内存并打印前若干字节:
use memmap2::MmapOptions; use std::os::windows::fs::OpenOptionsExt; use winapi::um::winbase::{FILE_MAP_READ, OPEN_EXISTING}; fn main() -> Result<(), Box<dyn std::error::Error>> { // Windows命名共享内存的名称,用原始字符串避免转义问题 const MEMMAP_NAME: &str = r"Local\IRSDKMemMapFileName"; const MEMMAP_SIZE: usize = 1164 * 1024; // 打开已有的命名内存映射对象 let file = std::fs::OpenOptions::new() .read(true) .custom_flags(OPEN_EXISTING) .open(format!("\\\\.\\{}", MEMMAP_NAME))?; // 创建只读映射 let mmap = unsafe { MmapOptions::new() .len(MEMMAP_SIZE) .map(&file)? }; // 读取并打印前100字节(类似Python的readline行为) println!("{:?}", &mmap[0..100]); Ok(()) }
代码说明
- Windows下访问命名内存映射需要用
\\.\{name}的格式,原始字符串r""避免了反斜杠转义的麻烦 OPEN_EXISTING标记确保我们只打开已存在的映射(需在iRacing启动后运行程序)memmap2的Mmap是安全的只读视图,无需手动管理原始指针(特殊场景除外)
方案2:修正shared_memory的用法
你之前的代码存在两个关键问题:
- 字符串转义错误:
"Local\IRSDKMemMapFileName"中的\I会被解析为转义字符,应改用原始字符串r"Local\IRSDKMemMapFileName"或转义反斜杠"Local\\IRSDKMemMapFileName" - 方法误用:
flink是用于文件链接的,而iRacing提供的是命名共享内存对象,需用name方法指定共享内存名称
修正后的代码:
use shared_memory::ShmemConf; fn main() { const MEMMAP_NAME: &str = r"Local\IRSDKMemMapFileName"; const MEMMAP_SIZE: usize = 1164 * 1024; let iracing_memory = match ShmemConf::new() .size(MEMMAP_SIZE) .name(MEMMAP_NAME) .open() { Ok(m) => m, Err(e) => { eprintln!("无法打开共享内存 {MEMMAP_NAME}: {e}"); return; } }; // 安全读取前8字节示例 let data = unsafe { std::slice::from_raw_parts(iracing_memory.as_ptr(), 8) }; println!("{:?}", data); }
后续提示
iRacing的共享内存遵循固定的IRSDK数据结构,可参考官方文档解析二进制数据。另外,程序需在iRacing启动后运行,否则会出现“找不到对象”的错误。
内容的提问来源于stack exchange,提问作者Shaun H
相关产品推荐
相关产品推荐

