Closed
Description
More investigation from #13073.
extern crate native;
extern crate green;
extern crate rustuv;
use std::libc::{c_void, LPWSTR, LPVOID, DWORD};
extern "system" {
fn MessageBoxA(hWnd: u32, lpText: *u8, lpCaption: *u8, uType: u32) -> i32;
fn FormatMessageW(flags: DWORD,
lpSrc: LPVOID,
msgId: DWORD,
langId: DWORD,
buf: LPWSTR,
nsize: DWORD,
args: *c_void)
-> DWORD;
fn GetLastError() -> u32;
}
fn test() {
let mut buf: [u16, ..50] = [0, ..50];
let ret = unsafe {
FormatMessageW(0x1000, 0 as *mut c_void, 1, 0x400,
buf.as_mut_ptr(), buf.len() as u32, 0 as *c_void)
};
if ret == 0 {
let err = unsafe { GetLastError() };
println!("err: {:?}", err);
}
let s = std::str::from_utf16(buf);
println!("{:?}", s);
//unsafe {
// MessageBoxA(0, "ABC".as_ptr(), "ABC".as_ptr(), 0);
//}
}
fn main() {
if cfg!(spawn) {
spawn(proc() {
test();
});
} else {
test();
}
}
#[start]
pub fn start(argc: int, argv: **u8) -> int {
if cfg!(green) {
green::start(argc, argv, rustuv::event_loop, main)
} else if cfg!(raw) {
main();
0
} else {
native::start(argc, argv, main)
}
}
If the code is bulit with --cfg green
, --cfg raw
or --cfg spawn
, it works as expected. However, if it is built with no cfg, it behaves strangely: FormatMessageW()
fails to get system locale mssage, and MessageBoxA()
shows gui message box with non-system-themed border.
I guess the main task has bad thread-local data due to libnative::start()
.