作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在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/
我是一名优秀的程序员,十分优秀!