【问题标题】:Rust - Wrapping FFI PointersRust - 包装 FFI 指针
【发布时间】: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 函数来返回对指针的引用,但我认为这会破坏首先包装指针的目的,因为通过指针对函数使用的所有限制可以绕过。

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

非常感谢您的回答,在此先感谢。

【问题讨论】:

    标签: pointers rust wrapper ffi


    【解决方案1】:

    找到解决方案:

    使用pub (crate),内部指针只能被 crate 中的代码访问,外部用户不能访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多