use std::ffi::CStr; use std::os::raw::c_char; use std::os::raw::c_int; #[no_mangle] #[derive(Debug)] pub struct Bidule { pub i: c_int } // la définition d'un type facilite la maintenance et la lisibilité type FctRappel = fn( *mut Bidule ) -> i8; #[no_mangle] pub extern fn executer( b: *mut Bidule, fctrappel: FctRappel ) -> i8 { println!("Rust exécute quelque chose..."); // j'aurai pu ici agir sur mon bidule fctrappel( b ) // ou ici, et renvoyer un i8 } #[no_mangle] pub extern fn afficher( s: *const c_char, b: *mut Bidule ) -> i8 { unsafe { let mut b: &mut Bidule = match b.as_mut() { Some( b ) => b, None => return -1 }; b.i += 1; match CStr::from_ptr(s).to_str() { Ok( texte ) => println!( "[{:?}] votre message : {:?}", b, texte ), Err( _ ) => return -1 } 0 } }