Hi all.
I'm dealing with an external .so dll library on Linux. This is and extract of my code:
use libc::{c_int, c_ulong};
type ExtFunc = extern "C" fn(arg1: c_ulong);
#[repr(C)]
#[derive(Clone, Debug)]
struct ComesFromDLL {
field1: c_ulong,
field2: c_int,
func_pointer: *const ExtFunc
}
fn main() {
/* ... dll loading using libloading crate ... */
let descriptor_struct: ComesFromDLL = /* ... calling a function dll to get a pointer to ComesFromDLL struct */
}
the struct ComesFromDLL
is defined just like the dll's .h file. I can read the field1
and field2
fields and they are correct. So far, so good.
My problem is that I need to check if func_pointer
is null in order to know if I can call that function or not, as per dll specifications; if I define the field as (A):
func_pointer: *const ExtFunc
i can check if it is null with descriptor_struct.func_pointer.is_null()
, and it works.
If I define the field as (B):
func_pointer: ExtFunc
I can call the function using (descriptor_struct.func_pointer)(10, 20);
and it works.
But I can't do both. If I define the field as (A) I get a call expression requires function
error when I try to call the function and in case (B) the .is_null()
method isn't available.
I suspect my approach here isn't right.
What should I do?
Thanks!