我注意到,当从 MME 读取 MIDI 端口名称时,这些名称是使用 ANSI 代码页编码的多字节字符串,我的应用程序默认使用它。从 DirectMusic 驱动程序接收这些名称时,这些名称是使用 OEM 代码页编码的宽字符串。有关代码页的快速复习,请参阅Raymond Chen 的这篇文章。
在我的德语系统上,这意味着当使用当前代码页(原来是 ANSI 代码页)时,我从 MME 获得“Audiogerät”,从 DirectMusic 获得“Audioger ö t”,后者是错误的。当我将该姓氏视为 OEM 编码时,此问题将得到解决。
那么我怎么知道使用哪个代码页来解码这些名称呢?为什么来自 DirectMusic 的名称编码不同?它来自USB驱动程序吗?COM 框架?直接音乐?在读取我的 MIDI 端口名称时,如何确定使用哪个代码页?
有关信息:
- 我使用
MultiByteToWideChar()
andWideCharToMultiByte()
函数来执行转换,并使用CP_ACP
andCP_OEMCP
作为要使用的代码页的参数。 - 我用来
midiInGetDeviceCaps()
从 MME 子系统获取 MIDI 端口信息... - ...并
MIDIINCAPS.szPname
使用CP_ACP
(ANSI)代码页进行转换。 - 我用来
IID_IDirectMusic8::EnumPort()
从 DirectMusic 获取端口信息... - ...并
DMUS_PORTCAPS.wszDescription
使用CP_OEMCP
代码页进行转换。