2009-07-01 14 views
2

我注意到,當從MME讀取MIDI端口名稱時,名稱是使用ANSI Codepage進行編碼的多字節字符串,默認情況下我的應用程序使用該代碼頁。從DirectMusic驅動程序接收這些名稱時,這些名稱是使用OEM代碼頁編碼的寬字符字符串。請參閱this article by Raymond Chen以便快速瞭解代碼頁。使用MME和DirectMusic時的ANSI或OEM代碼頁?

在我的德制,這意味着使用當前代碼頁,這原來是ANSI一個時,我得到「Audiogerät」從MME和「Audioger ö噸」從的DirectMusic,後者是錯誤的。當我將這個姓氏當作OEM編碼處理時,這會得到解決。

那麼我怎麼知道用哪個代碼頁來解碼這些名字呢?爲什麼來自DirectMusic的名稱的編碼方式不同?它來自USB驅動程序嗎? COM框架?的DirectMusic? 如何在讀取我的MIDI端口名稱時確定知道使用哪個代碼頁?

對於信息:

  • 我使用MultiByteToWideChar()WideCharToMultiByte()功能作爲論據的代碼頁使用進行轉換,從CP_ACPCP_OEMCP
  • 我用midiInGetDeviceCaps()來從MME子系統MIDI端口信息...
  • ...並轉換MIDIINCAPS.szPname使用CP_ACP(ANSI)代碼頁。
  • 我用IID_IDirectMusic8::EnumPort()從獲得的DirectMusic端口信息...
  • ...並使用CP_OEMCP代碼頁轉換DMUS_PORTCAPS.wszDescription
+0

你能舉出代碼示例,或者至少是你使用的特定Win32函數的名字嗎? – user9876 2009-07-01 15:38:52

+0

通常這個「OEM代碼頁」是IBM CP437(US)。其餘時間可能是IBM CP850(歐洲)。 – 2009-07-13 04:30:18

回答

0

我不知道爲什麼DirectMusic框架會使用一組代碼頁,另一個是MME,但是您的最終解決方案可能是構建一個抽象層,然後爲每個API創建特定的實現。這樣,你的軟件的更高層次就不需要關注像這樣的細節。

也就是說,端點名稱絕對來自操作系統。 USB MIDI設備僅指定端點類型(即輸入或輸出以及數字),但操作系統可以自由地解釋它們,因爲它認爲合適,這就是它們本地化的原因。

沒有一個特定的API調用(據我所知)找出框架將提供其字符串的代碼頁。但是,DirectMusic似乎使用雙寬字符與OEM代碼頁作爲一般約定,但我無法在任何MSDN文檔中找到清楚說明的內容。在MSDN DirectMusic documentation about MIDI port capability structures中,描述類型明確定義爲WCHAR,並且Game Audio Programming書似乎也表明此類型是API範圍的約定。雖然假設OEM是這些字符的默認編碼是危險的,但我找不到任何其他說法(並且搜索「DirectMusic代碼頁」現在將此頁列爲熱門搜索)。

編輯:看看這個stackoverflow question on determining the current OS codepage。 DirectMusic API可能以這種方式設置代碼頁。