I have a non-unicode (MBCS) C++ project building with VS2013.
Given a BSTR
value, how should I pass this to printf safely?
I have a non-unicode (MBCS) C++ project building with VS2013.
Given a BSTR
value, how should I pass this to printf safely?
A BSTR
really is a WCHAR*
with preceding length information. You can ignore that length part for printing purposes. So:
BSTR str = foo();
printf("%S", str); // Capital S
BSTR
being Microsoft-specific this isn't an issue. %ls
is portable. –
Mccollough wprintf()
–
Rhombus A BSTR
is a pointer to a length-prefixed (at offset -4) and 0
-terminated wide-character string. You can pass it to any function that is capable of handling a 0
-terminated wide-character string. (The actual string starts at offset 0
.)
If the target function cannot handle wide characters, then you need to convert the string to multibyte characters (this is the case if you want to use standard printf
where the S
type field character is not available). This (already commented) link provides information about that: Convert BSTR to char*
@MSalters' answer has the code example (don't want to duplicate 2 trivial lines): https://mcmap.net/q/1666447/-how-to-pass-bstr-to-printf
© 2022 - 2024 — McMap. All rights reserved.
printf
can printwchar_t
so there's no point in the conversion. – Mccollough_bstr_t
is the answer, as it so often is with BSTR? – Mainland