about summary refs log tree commit diff
path: root/compiler/rustc_codegen_cranelift/example/raw-dylib.rs
blob: 4711884f76af6cd79be24a7e5ad793da41d2fff5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Tests the raw-dylib feature for Windows.
// https://doc.rust-lang.org/reference/items/external-blocks.html#the-link-attribute

fn main() {
    #[cfg(windows)]
    {
        #[link(name = "kernel32", kind = "raw-dylib")]
        extern "C" {
            fn GetModuleFileNameA(
                module: *mut std::ffi::c_void,
                filename: *mut u8,
                size: u32,
            ) -> u32;
        }

        // Get the filename of the current executable....
        let mut buffer = [0u8; 1024];
        let size = unsafe {
            GetModuleFileNameA(core::ptr::null_mut(), buffer.as_mut_ptr(), buffer.len() as u32)
        };
        if size == 0 {
            eprintln!("failed to get module file name: {}", std::io::Error::last_os_error());
            return;
        } else {
            // ...and make sure that it matches the test name.
            let filename =
                std::ffi::CStr::from_bytes_with_nul(&buffer[..size as usize + 1]).unwrap();
            assert!(filename.to_str().unwrap().ends_with("raw-dylib.exe"));
        }
    }
}