Rust - 包装 FFI 指针

Rust - Wrapping FFI Pointers

我正在尝试以 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 函数的接口,这些函数很可能位于与容器结构不同的模块中,因此它们无法访问原始指针容器中的指针。

我当然可以发布指针或添加一个 get_ptr 函数 returns 对指针的引用,但我认为这首先会破坏包装指针的目的, 因为可以规避通过指针使用函数的所有限制。

现在,我问,是否有一种不同的方法可以仅将指针暴露给那些我错过的函数,或者我是否必须使用完全不同的方法来包装这些指针?

非常感谢您的回答,提前致谢。

找到解决方案:

使用 pub (crate),可以使内部指针仅供 crate 中的代码访问,而外部用户无法访问。