Pregunta

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?

¿Fue útil?

Solución

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.

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top