Rust FFI,如何写入传递的C指针(类C API)?

nxowjjhe  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在尝试编写一个与C兼容的API。对于这个特定的调用,我希望返回一个错误代码并接收一个指针,如果没有抛出错误,则指向将创建的结构。
下面是我编译的代码:

pub extern "C" fn create_engine(mut _qe_ptr: *mut Engine) -> c_int {
    let engine_res = Engine::new();
    match engine_res {
        Ok(v) => {
            _qe_ptr = Box::into_raw(Box::new(v));
            return 0;
        }
        Err(e) => {
            println!("Error creating engine {:#?}", e);
            return 1;
        }
    }
}

字符串
Engine也是C和Rust之间的一个共享结构体,所以如果我从调用中返回一个*mut Engine指针,一切都很好。
在调用完成后,调用C代码的指针上仍然有NULL。有什么方法可以实现这一点吗?

Engine *qe;
int res = create(qe);
  
if (res != 0) {
    throw std::runtime_error("Failed to create engine");
}

pxq42qpu

pxq42qpu1#

我找到了答案。在再次阅读some documentation并理解*mut p等效于Cs *p并查看it would be done in pure C如何之后,我明白了我试图重新重写指针而不是更改指针值。
正确的答案将是一个指针指向一个指针,然后可以被覆盖:

#[no_mangle]
pub extern "C" fn create(_qe_ptr: *mut *mut Engine) -> c_int {
    let res = Engine::new(constructor_options);
    match res {
        Ok(v) => {
            unsafe {
                *_qe_ptr = Box::into_raw(Box::new(v));
            }
            return 0;
        }
        Err(e) => {
            return 1;
        }
    }
}

字符串

相关问题