如何在Rust中将C / C ++ void *取消引用以进行结构化或回调?

问题描述

我想用Rust编写一款适用于旧游戏的AI。此游戏的AI是库,在Linux端口中,它只是一个.so文件导出:

extern "C" void client(int Command,int Player,void *Data);

void *Data可以是struct(取决于Command)或此函数:

typedef int TServerCall(int Command,int Subject,void *Data);

在C ++中,AI代码根据命令将其强制转换为已知大小或回调的结构,例如:

typedef int __stdcall TServerCall(int Command,void *Data);

或构造:

// where G is a extern TNewGameData G;

G = *(TNewGameData *) Data;

然后我可以访问G或其他结构或数组的字段。

问题:

如何将数据以void *的形式强制转换为Rust的结构或函数?

解决方法

您可以在Rust中强制转换原始指针。

use libc::{c_void,c_int};

#[repr(C)]
struct TNewGameData {
    // the fields go here
}

#[no_mangle]
pub extern "C" fn client(command: c_int,player: c_int,data: *mut c_void) {
    // Cast raw pointer to the right type.
    let game_data_ptr = data as *mut TNewGameData;
    // Convert to Rust reference.
    let game_data = unsafe { &mut *data };
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...