gpt4 book ai didi

pointers - Rust - 包装 FFI 指针

转载 作者:行者123 更新时间:2023-12-03 11:49:04 27 4
gpt4 key购买 nike

我正在尝试以 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 时调用。

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

我当然可以将指针设为 pub 或添加一个 get_ptr 函数来返回对指针的引用,但我认为这会破坏首先包装指针的目的,因为可以绕过通过指针使用函数的所有限制.

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

非常感谢答案,在此先感谢。

最佳答案

找到解决方案:

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

关于pointers - Rust - 包装 FFI 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61260829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com