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 中的代码访问,而外部用户无法访问。
我正在尝试以 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 中的代码访问,而外部用户无法访问。