dmDeviceName - это просто 'c' - PullRequest
       35

dmDeviceName - это просто 'c'

1 голос
/ 17 октября 2011

Я пытаюсь получить имена каждого из моих мониторов, используя DEVMODE.dmDeviceName:

dmDeviceName
Завершенный нулеммассив символов, который определяет «дружественное» имя принтера или дисплея;например, «PCL / HP LaserJet» в случае PCL / HP LaserJet.Эта строка является уникальной среди драйверов устройств.Обратите внимание, что это имя может быть усечено для размещения в массиве dmDeviceName.

Я использую следующий код:

log.printf("Device Name: %s",currDevMode.dmDeviceName);

Но для каждого монитора имя печатается какпросто c.Вся другая информация от DEVMODE, кажется, печатается хорошоЧто не так?

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Скорее всего, вы используете Unicode-версию структуры и, следовательно, передаете широкие символы в printf.Поскольку вы используете строку формата, которая подразумевает данные char, существует несоответствие.

Кодировка UTF-16 приводит к тому, что каждый второй байт равен 0 для символов в диапазоне ASCII, и поэтому printf считает, чтовторой байт первых двухбайтовых символов на самом деле является нулевым терминатором.

Это проблема, которую вы получаете с printf, которая, конечно, не имеет безопасности типов.Поскольку вы используете C ++, вероятно, стоит перейти на iostream ввод / вывод на основе.

Однако, если вы хотите использовать текст ANSI, как вы указали в комментарии, тогда самое простое решение - использовать ANSIDEVMODEA версия структуры и соответствующие A версии функций API, например, EnumDisplaySettingsA, DeviceCapabilitiesA.

1 голос
/ 17 октября 2011

dmDeviceName равно TCHAR[], поэтому, если вы компилируете для Unicode, первый широкий символ будет интерпретироваться как 'c', за которым следует нулевой терминатор.

Вам нужно будет преобразовать его вascii или используйте подпрограммы печати с поддержкой Unicode.

...