Подключение rust к DAR
Пример подключения dll сгенерированной на rust к DAR
Описание
DAR позволяет запускать dll, которые сгенерированы на rust
Код библиотеки на Rust
use std::{ffi::c_char, slice};
#[unsafe(no_mangle)]
pub extern "C" fn dar_print(ptr: *const c_char, len: usize,) {
if ptr.is_null() {
println!("empty");
return;
}
let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
match std::str::from_utf8(bytes,) {
Ok(s,) => println!("{}", s),
Err(_,) => eprintln!("[print-stub] invalid UTF-8"),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn send_to_server(ptr: *const c_char, len: usize,) {
if ptr.is_null() {
eprintln!("[send_to_server] received empty");
return;
}
let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
match std::str::from_utf8(bytes,) {
Ok(s,) => println!("[send_to_server] data: {}", s),
Err(_,) => eprintln!("[send_to_server] invalid UTF-8"),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn log_error(ptr: *const c_char, len: usize,) {
if ptr.is_null() {
eprintln!("[log_error] empty message");
return;
}
let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
match std::str::from_utf8(bytes,) {
Ok(s,) => eprintln!("ERROR: {}", s),
Err(_,) => eprintln!("[log_error] invalid UTF-8"),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn get_hostname(ptr: *const c_char, len: usize,) {
if ptr.is_null() {
println!("[get_hostname] called with empty");
} else {
let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
if let Ok(s,) = std::str::from_utf8(bytes,) {
println!("[get_hostname] called with argument: {}", s);
}
}
}
Скрипт на dar
external "print.dll" {
dar_print : print,
send_to_server,
log_error : log,
get_hostname
}
print("Hello, world!")
send_to_server("client data")
log("something went wrong")
get_hostname("test")