包裹FFI指针的指针

问题描述 投票:0回答:1

我正在尝试以Rust Safe方式包装FFI。FFI将原始指针公开给带有vtable的结构,基本上,一个结构如下所示:

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 _)
    }
}

释放方法很重要,因为在完成使用指针以避免内存泄漏时必须调用它。

现在,我当前正在将指针包装到这样的容器结构中:

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功能,因为它实际上只能在放置时调用。

现在,我面临的问题是,我需要将原始指针传递给FFI函数的接口,该接口很可能位于与容器结构不同的模块中,因此它们无法访问容器中的原始指针。容器。

我当然可以使指针成为pub或添加一个get_ptr函数,该函数返回对指针的引用,但是我认为这将首先破坏包装指针的目的,因为通过指针使用函数的所有限制都可能被规避。

现在,我问我,有没有其他方法可以将指针公开给那些我错过的功能,或者我必须使用一种完全不同的方法来包装那些指针吗?

非常感谢,谢谢。

pointers rust wrapper ffi
1个回答
0
投票

找到解决方案:

使用pub (crate),内部指针只能由板条箱中的代码访问,而不能由外部用户访问。

© www.soinside.com 2019 - 2024. All rights reserved.