You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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的用法

你之前的代码存在两个关键问题:

  1. 字符串转义错误:"Local\IRSDKMemMapFileName"中的\I会被解析为转义字符,应改用原始字符串r"Local\IRSDKMemMapFileName"或转义反斜杠"Local\\IRSDKMemMapFileName"
  2. 方法误用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:30:34