Search code examples
rustffi

Passing va_list from rust variadic to C


is it possible to pass variadic arguments from rust to C function?

extern "C" fn foo(fmt: const *i8, args: ...) {
    let buf1024 = vec![0; 1024];
    // How to pass args to wvsprintfA?
    winapi::um::winuser::wvsprintfA(
        buf1024.as_mut_ptr(),
        fmt,
        ?
    );
}

Solution

  • Based on @Chayim Friedman answer in comments, I ended using GetProcAddr with mem::transmute:

    let dll_handle = LoadLibrary("user32.dll");
    let func_addr = GetProcAddr(dll_handle, "wvsprintfW");
    let f: extern "C" fn(buf: *mut u16, fmt: *const u16, args: std::ffi::VaList) -> u32 = std::mem::transmute(func_addr);
    f(out_buf.as_mut_ptr(), fmt.as_ptr(), args.as_va_list());