2011-10-17 72 views
1

我試圖用DEVMODE.dmDeviceName讓我的每一個監視器的名稱:dmDeviceName僅僅是「C」

dmDeviceName
以零結尾的字符數組,指定的「友好」名稱打印機或顯示器;例如PCL/HP LaserJet中的「PCL/HP LaserJet」。該字符串在設備驅動程序中唯一。請注意,該名稱可能會被截斷以適應dmDeviceName數組。

我用下面的代碼:

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

但對每臺顯示器的姓名打印只是c。來自DEVMODE的所有其他信息似乎都可以打印。出了什麼問題?

回答

3

很可能您使用的是Unicode版本的結構,因此會將寬字符傳遞到printf。由於您使用暗示char數據的格式字符串,因此存在不匹配。

對於ASCII範圍內的字符,UTF-16編碼會導致其他字節爲0,因此printf認爲前兩個字節字符的第二個字節實際上是空終止符。

這是你用printf得到的那種問題,當然這種問題沒有類型安全性。由於您使用C++,因此可能需要切換到基於iostream的I/O。然而,如果你想使用ANSI文本,就像你在註釋中指出的那樣,那麼最簡單的解決方案就是使用結構的ANSI DEVMODEA版本和API函數的相應版本A,例如, EnumDisplaySettingsADeviceCapabilitiesA

+0

嗯,當使用EnumDisplaySettingsA時,我得到'不能將參數1從'WCHAR *'轉換爲'LPCSTR',其中參數1是使用'GetMonitorInfo'獲取的monitorInfo.szDevice。 – fredley

+1

這是全部或沒有。您需要'GetMonitorInfoA'和'EnumDisplaySettingsA'。當然,您可以將您的項目配置切換到ANSI。對於背景閱讀:http://msdn.microsoft.com/en-us/library/dd374089(VS.85).aspx –

+0

廣泛轉換爲ANSI的API是['WideCharToMultiByte()'](http:// msdn.microsoft.com/en-us/library/dd374130(VS.85).aspx)。這不是最簡單的,所以如果你可以調用ANSI API,那麼你會發現更容易。 –

1

dmDeviceNameTCHAR[]因此,如果您正在編譯unicode,則第一個寬字符將被解釋爲'c',然後是零終結符。

您需要將其轉換爲ascii或使用支持unicode的打印例程。

+0

我如何將它轉換爲ascii?我無法改變'log'的工作方式。 – fredley

+0

@fredley我在回答的最後幾段中已經介紹了這一點。 –

相關問題