diff --git a/crates/libs/bindgen/src/constants.rs b/crates/libs/bindgen/src/constants.rs index 1a08db0aeb..f1f63c4207 100644 --- a/crates/libs/bindgen/src/constants.rs +++ b/crates/libs/bindgen/src/constants.rs @@ -12,7 +12,11 @@ pub fn gen(gen: &Gen, def: Field) -> TokenStream { if ty == constant_type { if ty == Type::String { - let crate_name = gen.crate_name(); + let crate_name: TokenStream = if gen.sys && !gen.standalone { + "::windows_sys::core::".into() + } else { + "::windows_core::".into() + }; if gen.reader.field_is_ansi(def) { let value = gen.value(&gen.reader.constant_value(constant)); quote! { diff --git a/crates/libs/bindgen/src/standalone.rs b/crates/libs/bindgen/src/standalone.rs index 7fc44efeaa..03267c3238 100644 --- a/crates/libs/bindgen/src/standalone.rs +++ b/crates/libs/bindgen/src/standalone.rs @@ -67,8 +67,15 @@ fn standalone_imp(gen: &mut Gen, names: &[&str]) -> String { .find(|field| gen.reader.field_name(*field) == type_name.name) { constants.insert(field); - gen.reader - .type_collect_standalone(&gen.reader.field_type(field, None), &mut types); + + let ft = gen.reader.field_type(field, None); + + // String normally gets resolved to HSTRING, but since macros + // from windows_core/windows_sys::core are used to create the + // string literals we can skip the type collection + if ft != Type::String { + gen.reader.type_collect_standalone(&ft, &mut types); + } } if let Some(field) = gen diff --git a/crates/tests/standalone/build.rs b/crates/tests/standalone/build.rs index 7e688b1d00..2e3d58b8d1 100644 --- a/crates/tests/standalone/build.rs +++ b/crates/tests/standalone/build.rs @@ -118,7 +118,18 @@ fn main() { write_sys( "src/b_overloads.rs", &["Windows.Win32.NetworkManagement.NetManagement.AE_RESACCESS"], - ) + ); + + // Ensures that string constants are written correctly + write_sys( + "src/b_string_constants.rs", + &[ + // utf-16 + "Windows.Win32.Devices.Enumeration.Pnp.ADDRESS_FAMILY_VALUE_NAME", + // ansi + "Windows.Win32.Media.Multimedia.JOY_CONFIGCHANGED_MSGSTRING", + ], + ); } fn write_sys(filename: &str, apis: &[&str]) { diff --git a/crates/tests/standalone/src/b_string_constants.rs b/crates/tests/standalone/src/b_string_constants.rs new file mode 100644 index 0000000000..2a37469fdf --- /dev/null +++ b/crates/tests/standalone/src/b_string_constants.rs @@ -0,0 +1,14 @@ +// Bindings generated by `windows-bindgen` 0.49.0 + +#![allow( + non_snake_case, + non_upper_case_globals, + non_camel_case_types, + dead_code, + clippy::all +)] +pub const ADDRESS_FAMILY_VALUE_NAME: ::windows_core::PCWSTR = ::windows_core::w!("AddressFamily"); +pub const JOY_CONFIGCHANGED_MSGSTRING: ::windows_core::PCSTR = + ::windows_core::s!("MSJSTICK_VJOYD_MSGSTR"); +pub type PCSTR = *const u8; +pub type PCWSTR = *const u16; diff --git a/crates/tests/standalone/src/lib.rs b/crates/tests/standalone/src/lib.rs index 46063d771a..edae464f7f 100644 --- a/crates/tests/standalone/src/lib.rs +++ b/crates/tests/standalone/src/lib.rs @@ -19,6 +19,7 @@ mod b_pcwstr; mod b_pstr; mod b_pwstr; mod b_std; +mod b_string_constants; mod b_stringable; mod b_test; mod b_unknown;