Я пытаюсь обернуть FFI в Rust Safe. 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();
}
}
Обратите внимание, что я не сделал функцию Release в пабе Container, потому что это на самом деле должен вызываться только по капле.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что мне нужно передать необработанный указатель на интерфейс в функции FFI, которые, скорее всего, будут находиться в разных модулях, чем структуры контейнера. поэтому они не могут получить доступ к необработанным указателям в контейнерах.
Я, конечно, мог бы сделать указатели пабом или добавить функцию get_ptr, которая возвращает ссылку на указатель, но я думаю, что это побеждает цель оборачивать указатель в первую очередь, поскольку все ограничения на использование функций через указатели могут быть обойдены. * 10 13 *
Теперь, я спрашиваю, есть ли другой способ выставить указатель только на те функции, который я пропустил, или мне нужно использовать совершенно другой подход к обертыванию этих указателей?
Ответы высоко ценится, заранее спасибо.