c++ - dmDeviceName 只是 'c'

标签 c++ winapi dev-mode

我正在尝试使用 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.

我正在使用以下代码:

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

但对于每个监视器,名称仅打印为 c。来自 DEVMODE 的所有其他信息似乎打印正常。出了什么问题?

最佳答案

您很可能正在使用该结构的 Unicode 版本,因此将宽字符传递给 printf。由于您使用的格式字符串暗示 char 数据存在不匹配。

UTF-16 编码导致 ASCII 范围内的字符每隔一个字节为 0,因此 printf 认为前两个字节字符的第二个字节实际上是空终止符。

这是您使用 printf 时遇到的那种问题,它当然没有类型安全性。由于您使用的是 C++,因此可能值得切换到基于 iostream 的 I/O。

但是,如果你想使用 ANSI 文本,正如你在评论中指出的那样,那么最简单的解决方案是使用结构的 ANSI DEVMODEA 版本和相应的 A 版本,例如EnumDisplaySettingsADeviceCapabilitiesA

关于c++ - dmDeviceName 只是 'c',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7792163/

相关文章:

c++ - 协助乱码翻译

c++ - 使用 atomic_flag 自旋锁进行内存排序

c++ - directx 9 SetTime 不是成员 c++

screen-orientation - 使用 powershell 更改屏幕方向 - 注册表值存储在哪里?

c++ - 在C++ 11中是否有任何等于asm (“”::: “memory”)的编译器障碍?

c++ - openssl 支持 RSASSA-PPS ,RSA EMSA-PSS 编码吗?

c - HTTP 请求不使用 Winsock 的原因?

winapi - 在 Windows 中将焦点设置在控制台上?

c# - 以编程方式旋转显示?

c# - 无法更改打印机的 DEVMODE