dmDeviceName 只是'c'
dmDeviceName is just 'c'
本文关键字:只是 dmDeviceName 更新时间:2023-10-16
我正在尝试使用DEVMODE.dmDeviceName
:获取每个监视器的名称
dmDeviceName
一个以零结尾的字符数组,用于指定打印机或显示器的"友好"名称;例如,在PCL/HP LaserJet的情况下为"PCL/HP激光射流"。此字符串在设备驱动程序中是唯一的。请注意,此名称可能会被截断以适合dmDeviceName数组。
我使用以下代码:
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
版本和API函数的相应A
版本,例如EnumDisplaySettingsA
、DeviceCapabilitiesA
。
dmDeviceName
是TCHAR[]
,因此如果您为unicode进行编译,则第一个宽字符将被解释为'c',后跟一个零终止符。
您需要将其转换为ascii或使用支持unicode的打印例程。
相关文章:
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 地图计数确实很重要,或者只是检查是否存在
- 为什么:不同符号的整数比较只是偶尔发生?
- 我的二进制搜索程序只是关闭了
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 交叉编译:特殊的交叉编译器还是只是带有选项 -march 的 gcc?
- 代码编译但不起作用!cmd窗口只是理想和理想,但什么也没发生
- C++ 成员不是变量,而只是数据类型的名称吗?
- OpenGL只是渲染一个黑色的方块
- 电子游戏只是一个大循环吗?
- 我只是在寻找模板,在我的书中找到了这段代码,这显示了隔离错误?
- 下面的代码是如何工作的?它输出分解的数字并且功能齐全,我只是不明白它是如何做到的
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- Lambda只是重载了运算符()的类
- cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但
- C++ 堆栈推送方法不会将结构推送到堆栈上,只是返回 0
- C++ - 析构函数只是释放内存还是实际删除对象
- 我只是想让我的代码正确编译
- dmDeviceName 只是'c'