【发布时间】:2020-04-16 22:06:12
【问题描述】:
我正在尝试以 Rust 安全的方式包装 FFI。 FFI 使用 vtables 公开指向结构的原始指针,基本上一个结构看起来像这样:
pub struct InterfaceVTBL {
pub Release: unsafe extern "system" fn(This: *mut Interface) -> u64
}
pub struct Interface {
pub lpVtbl: *const InterfaceVTBL,
}
impl Interface {
pub unsafe fn Release(&self) -> u64 {
((*self.lpVtbl).Release)(self as *const _ as *mut _)
}
}
Release 方法很重要,因为必须在使用完指针后调用它以避免内存泄漏。
现在,我目前正在像这样将我进入容器结构的指针包装起来:
pub struct InterfaceContainer {
interface: *mut Interface
}
impl InterfaceContainer {
fn Release(&mut self) {
let reference = &*self.interface;
reference.Release();
}
}
impl Drop for InterfaceContainer {
fn drop(&mut self) {
self.Release();
}
}
注意,我没有制作 Container pub 的 Release 函数,因为它真的应该只在 drop 时调用。
现在,我面临的问题是,我需要将原始指针传递给 FFI 函数的接口,这些函数很可能位于与容器结构不同的模块中,因此它们无法访问原始指针容器。
我当然可以将指针设为 pub 或添加一个 get_ptr 函数来返回对指针的引用,但我认为这会破坏首先包装指针的目的,因为通过指针对函数使用的所有限制可以绕过。
现在,我在问,是否有一种不同的方式将指针只暴露给那些我错过的函数,或者我必须使用完全不同的方法来包装这些指针?
非常感谢您的回答,在此先感谢。
【问题讨论】: