Rust - упаковка указателей FFI - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь обернуть 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 *

Теперь, я спрашиваю, есть ли другой способ выставить указатель только на те функции, который я пропустил, или мне нужно использовать совершенно другой подход к обертыванию этих указателей?

Ответы высоко ценится, заранее спасибо.

1 Ответ

0 голосов
/ 01 мая 2020

Нашел решение:

Используя pub (crate), внутренний указатель может быть сделан доступным только для кода в ящике, а не для внешних пользователей.

...