第一个“类似的问题”向我展示时,张贴这是称为“如何调用C函数在锈蚀”。这与我所需要的正好相反。我能找到的每个教程都能从技术上回答我的问题,只有在DLL中导出Rust函数才能这样做,这样C可执行文件就可以使用extern "C"调用它。
但是我有一个Rust可执行文件,它调用一个C DLL函数,它使用一个Rust函数指针作为参数(我还没有编写这个C函数)。有没有演示如何做到这一点的基本示例?我已经让Rust调用了一些can函数,但是我需要为Rust和C编写代码,以便C可以执行一个Rust回调。
发布于 2021-02-20 07:26:31
如果将此C代码编译到名为lib.dll的库中,则导出一个函数,该函数接受指向不带参数且不返回任何参数的函数的指针:
__declspec(dllexport) void foo(void (*callback)()) {
callback();
}然后,这个锈蚀代码将把函数callback发送给那个C函数。执行时,它将打印行"callback()"。
extern "C" fn callback() -> () {
println!("callback()");
}
fn main() {
println!("main()");
call_dynamic();
}
fn call_dynamic() -> Result<u32, Box<dyn std::error::Error>> {
unsafe {
let lib = libloading::Library::new("lib.dll")?;
let foo: libloading::Symbol<extern "C" fn(extern "C" fn()) -> u32> = lib.get(b"foo")?;
Ok(foo(callback))
}
}您应该在控制台中看到这一点:
main()
callback()我在Windows上并使用以下命令编译了C代码:
gcc --shared lib.c -o lib.dllRust代码是这样运行的:
cargo runhttps://stackoverflow.com/questions/66288855
复制相似问题