#[test] fn test_static_ptr() {
make_helpers(); unsafe { let lib = Library::new(lib_path()).unwrap(); let var: Symbol<*mut *mut ()> = lib.get(b"TEST_STATIC_PTR\0").unwrap();
**var = *var as *mut _; let works: Symbol<unsafeextern"C"fn() -> bool> =
lib.get(b"test_check_static_ptr\0").unwrap();
assert!(works());
}
}
#[test] // Something about i686-pc-windows-gnu, makes dll initialisation code call abort when it is loaded // and unloaded many times. So far it seems like an issue with mingw, not libloading, so ignoring // the target. Especially since it is very unlikely to be fixed given the state of support its // support. #[cfg(not(all(target_arch = "x86", target_os = "windows", target_env = "gnu")))] fn manual_close_many_times() {
make_helpers(); let join_handles: Vec<_> = (0..16)
.map(|_| {
std::thread::spawn(|| unsafe { for _ in0..10000 { let lib = Library::new(lib_path()).expect("open library"); let _: Symbol<unsafeextern"C"fn(u32) -> u32> =
lib.get(b"test_identity_u32").expect("get fn");
lib.close().expect("close is successful");
}
})
})
.collect(); for handle in join_handles {
handle.join().expect("thread should succeed");
}
}
#[cfg(unix)] #[test] fn library_this_get() { use libloading::os::unix::Library;
make_helpers(); // SAFE: functions are never called unsafe { let _lib = Library::new(lib_path()).unwrap(); let this = Library::this(); // Library we loaded in `_lib` (should be RTLD_LOCAL).
assert!(this
.get::<unsafeextern"C"fn()>(b"test_identity_u32")
.is_err()); // Something obscure from libc...
assert!(this.get::<unsafeextern"C"fn()>(b"freopen").is_ok());
}
}
#[cfg(windows)] #[test] fn library_this() { use libloading::os::windows::Library;
make_helpers(); unsafe { // SAFE: well-known library without initialisers is loaded. let _lib = Library::new(lib_path()).unwrap(); let this = Library::this().expect("this library"); // SAFE: functions are never called. // Library we loaded in `_lib`.
assert!(this
.get::<unsafeextern"C"fn()>(b"test_identity_u32")
.is_err()); // Something "obscure" from kernel32...
assert!(this.get::<unsafeextern"C"fn()>(b"GetLastError").is_err());
}
}
#[cfg(windows)] #[test] fn works_getlasterror() { use libloading::os::windows::{Library, Symbol}; use windows_sys::Win32::Foundation::{GetLastError, SetLastError};
unsafe { let lib = Library::new("kernel32.dll").unwrap(); let gle: Symbol<unsafeextern"system"fn() -> u32> = lib.get(b"GetLastError").unwrap();
SetLastError(42);
assert_eq!(GetLastError(), gle())
}
}
#[cfg(windows)] #[test] fn works_getlasterror0() { use libloading::os::windows::{Library, Symbol}; use windows_sys::Win32::Foundation::{GetLastError, SetLastError};
unsafe { let lib = Library::new("kernel32.dll").unwrap(); let gle: Symbol<unsafeextern"system"fn() -> u32> = lib.get(b"GetLastError\0").unwrap();
SetLastError(42);
assert_eq!(GetLastError(), gle())
}
}
#[cfg(windows)] #[test] fn library_open_already_loaded() { use libloading::os::windows::Library;
// Present on Windows systems and NOT used by any other tests to prevent races. const LIBPATH: &str = "Msftedit.dll";
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.