gpt4 book ai didi

rust - Rust 如何在 Windows 平台上调用 ufmodlib DLL?

转载 作者:行者123 更新时间:2023-12-03 11:48:26 26 4
gpt4 key购买 nike

我在windows平台,想实现xm音频文件的播放。我寻找了一个名为 ufmod 的动态链接库。官网还有一些其他相关的demo,但是不知道在rust上怎么实现。以下是我的一段代码,它不起作用。

use libloading as lib;
use std::io;
use std::ffi::{CString, c_void};

fn main() {
let uFMOD = lib::Library::new("ufmod.dll").unwrap();
unsafe {
let uFMOD_PlaySong: lib::Symbol<unsafe extern fn(filename: std::ffi::CString, typeoc: i32,
dwFlags: i32) -> c_void> = uFMOD.get(b"uFMOD_PlaySong").unwrap();
uFMOD_PlaySong(CString::new("d:/xm2/obc.xm").unwrap(), 0, 2);
}
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
}
这是该图书馆的网站链接: http://ufmod.sourceforge.net/

最佳答案

CString不能直接通过FFI。
documentation 中所述,您应该调用.as_ptr()在字符串上并传递结果 *const c_char到国外功能。
文件名也应该绑定(bind)在函数的顶部,以便在程序结束时释放它,而不是紧跟在 uFMOD_PlaySong 之后。 .

use libloading as lib;
use std::io;
use std::ffi::{CString, c_void};
use std::os::raw::c_char;

fn main() {
let uFMOD = lib::Library::new("ufmod.dll").unwrap();
let filename = CString::new("d:/xm2/obc.xm").unwrap();
unsafe {
let uFMOD_PlaySong: lib::Symbol<unsafe extern fn(filename: *const char, typeoc: i32,
dwFlags: i32) -> c_void> = uFMOD.get(b"uFMOD_PlaySong").unwrap();
uFMOD_PlaySong(filename.as_ptr(), 0, 2);
}
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
}

关于rust - Rust 如何在 Windows 平台上调用 ufmodlib DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62498387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com