Call a function in a shared library/OCaml: Difference between revisions

added void parameter
m (fixed correctly free when failure)
(added void parameter)
Line 13:
| String of string
| Ptr of pointer
| Void
 
type return_type =
Line 20 ⟶ 21:
| Return_string
| Return_ptr
| Return_void
 
type rtld_flags =
Line 189 ⟶ 191:
arg_values[i] = &Field(v,0);
} break;
case 5: /* Void */
caml_invalid_argument("fficall");
break;
}
}
Line 206 ⟶ 211:
break;
case 4: /* Return_ptr */
rtype = &ffi_type_pointer;
break;
case 5: /* Return_void */
rtype = &ffi_type_pointer;
break;
Line 241 ⟶ 249:
ffi_call(&cif, (void (*)(void)) func_handle, &result, arg_values);
ml_ret = Val_tagged( (value) result, 4);
} break;
case 5: /* Return_void */
{ ffi_arg result;
ffi_call(&cif, (void (*)(void)) func_handle, &result, arg_values);
ml_ret = Val_int(0);
} break;
}
Line 347 ⟶ 360:
| String v -> Printf.printf "ocaml: got (String \"%s\")\n%!" v
| Ptr _ -> Printf.printf "ocaml: got (Ptr)\n%!"
| Void -> Printf.printf "ocaml: got (Void)\n%!"
 
let main1() =
Line 382 ⟶ 396:
let func = dlsym ~lib ~func_name:"func_float_param" in
handle_return(fficall ~func ~args:[| Float 211.7 |] ~return:Return_float);
dlclose ~lib;
;;
 
let main6() =
let lib = dlopen "./fakelib.so" [RTLD_LAZY] in
let func = dlsym ~lib ~func_name:"func_void_param" in
handle_return(fficall ~func ~args:[| |] ~return:Return_void);
dlclose ~lib;
;;
Line 391 ⟶ 412:
print_newline(); main4();
print_newline(); main5();
print_newline(); main6();
;;</lang>
 
Line 448 ⟶ 470:
printf("c: got float (%g)\n", f); fflush(stdout);
return 233.2;
}
 
void func_void_param(void)
{
printf("c: void function\n"); fflush(stdout);
}
</lang>