Reputation: 33931
I'm trying to get the names of each of my monitors using DEVMODE.dmDeviceName
:
dmDeviceName
A zero-terminated character array that specifies the "friendly" name of the printer or display; for example, "PCL/HP LaserJet" in the case of PCL/HP LaserJet. This string is unique among device drivers. Note that this name may be truncated to fit in the dmDeviceName array.
I'm using the following code:
log.printf("Device Name: %s",currDevMode.dmDeviceName);
But for every monitor, the name is printed as just c
. All other information from DEVMODE seems to print ok. What's going wrong?
Upvotes: 2
Views: 919
Reputation: 613382
Most likely you are using the Unicode version of the structure and thus are passing wide characters to printf
. Since you use a format string that implies char
data there is a mis-match.
The UTF-16 encoding results in every other byte being 0 for characters in the ASCII range and so printf
thinks that the second byte of the first two byte character is actually a null-terminator.
This is the sort of problem that you get with printf
which of course has no type-safety. Since you are using C++ it's probably worth switching to iostream
based I/O.
However, if you want to use ANSI text, as you indicate in a comment, then the simplest solution is to use the ANSI DEVMODEA
version of the struct and the corresponding A
versions of the API functions, e.g. EnumDisplaySettingsA
, DeviceCapabilitiesA
.
Upvotes: 4
Reputation: 1674
dmDeviceName
is TCHAR[]
so if you're compiling for unicode, the first wide character will be interpreted as a 'c' followed by a zero terminator.
You will need to convert it to ascii or use unicode capable printing routines.
Upvotes: 2