2

MMEからMIDIポート名を読み取るとき、名前はANSIコードページを使用してエンコードされたマルチバイト文字列であることに気付きました。これは私のアプリがデフォルトで使用します。DirectMusicドライバーからこれらの名前を受け取る場合、名前はOEMコードページでエンコードされたワイド文字列です。コードページの簡単な復習については、RaymondChenによるこの記事を参照してください。

私のドイツ語システムでは、これは、ANSIコードページであることが判明した現在のコードページを使用すると、MMEから「Audiogerät」を取得、DirectMusicから「Audiogeröt」を取得することを意味します。後者は間違っています。これは、その姓を代わりにOEMエンコードとして扱うと修正されます。

では、これらの名前をデコードするコードページをどのように知ることができますか?DirectMusicに由来する名前が異なる方法でエンコードされるのはなぜですか?それはUSBドライバーから来ていますか?COMフ​​レームワーク?DirectMusic?MIDIポートの名前を読み取るときに使用するコードページを確実に知るにはどうすればよいですか?

情報:

  • 使用するコードページの引数として、およびを使用して変換を実行するためにand関数を使用しますMultiByteToWideChar()WideCharToMultiByte()CP_ACPCP_OEMCP
  • midiInGetDeviceCaps()MMEサブシステムからMIDIポート情報を取得するために使用します...
  • ...そして(ANSI)コードページMIDIINCAPS.szPnameを使用して変換します。CP_ACP
  • IID_IDirectMusic8::EnumPort()DirectMusicからポート情報を取得するために使用します...
  • DMUS_PORTCAPS.wszDescription...そしてコードページを使用して変換しCP_OEMCPます。
4

2 に答える 2

0

DirectMusicフレームワークが1セットのコードページを使用し、別のセットのMMEを使用する理由はわかりませんが、ここでの解決策は、おそらく抽象化レイヤーを構築してから、各APIに特定の実装を作成することです。そうすれば、ソフトウェアの上位レベルは、このような詳細に気を配る必要がありません。

とはいえ、エンドポイント名は間違いなくOSに由来します。USB MIDIデバイスは、エンドポイントタイプ(つまり、入力または出力のいずれか、および番号)のみを指定しますが、OSは、適切と思われる場合にそれらを自由に解釈できるため、ローカライズされます。

フレームワークが文字列を配信するコードページを見つけるための特定のAPI呼び出しは(私が知る限り)ありません。ただし、DirectMusicは、一般的な規則として、OEMコードページで倍幅の文字を使用しているようです。これは、MSDNドキュメントのいずれかに明確に記載されています。MIDIポート機能の構造に関するMSDNDirectMusicのドキュメントでは、説明の種類はWCHARとして明確に定義されており、ゲームオーディオプログラミングの本でも、この種類がAPI全体の規則であることが示されているようです。OEMがこれらの文字のデフォルトのエンコーディングであると想定するのは危険ですが、それ以外のことを言うものは見つかりません(「DirectMusicコードページ」をグーグルで検索すると、このページがトップヒットとして表示されます)。

編集:現在のOSコードページを決定する上でこのstackoverflowの質問をチェックしてください。DirectMusicAPIがこの方法でコードページを設定する可能性があります。

于 2009-07-09T19:02:48.107 に答える
0

これらのタイプのデータにどのコードページが使用されているかを自動的に判断する方法は実際にはありません。ここを参照してください:テキスト ファイルのエンコーディング/コードページを検出するにはどうすればよいですか

于 2009-07-13T04:34:15.067 に答える