我正在尝试以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函数,该函数返回对指针的引用,但是我认为这将首先破坏包装指针的目的,因为通过指针使用函数的所有限制都可能被规避。
现在,我问我,有没有其他方法可以将指针公开给那些我错过的功能,或者我必须使用一种完全不同的方法来包装那些指针吗?
非常感谢,谢谢。
找到解决方案:
使用pub (crate)
,内部指针只能由板条箱中的代码访问,而不能由外部用户访问。