2009-07-01 6 views
2

MME에서 MIDI 포트 이름을 읽을 때, 이름은 ANSI Codepage를 사용하여 인코딩 된 멀티 바이트 문자열입니다.이 코드는 기본적으로 내 앱에서 사용합니다. DirectMusic 드라이버에서 해당 이름을받을 때 이름은 OEM 코드 페이지로 인코딩 된 넓은 문자열입니다. 코드 페이지에 대한 간략한 정보는 this article by Raymond Chen을 참조하십시오.MME 및 DirectMusic을 사용할 때 ANSI 또는 OEM 코드 페이지?

내 독일어 시스템에서

, 이것은 ANSI 하나 밝혀 현재 코드 페이지를 사용할 때, 나는 후자는 잘못된 것으로, DirectMusic의에서 "ö톤 Audioger"을 "Audiogerät"를 얻을 MME에서하고 있음을 의미 . 이 성을 대신 OEM 인코딩으로 처리하면 해결됩니다.

그렇다면 해당 코드를 디코딩 할 코드 페이지를 어떻게 알 수 있습니까? 왜 DirectMusic에서 온 이름이 다른 방식으로 인코딩 되나요? 그것은 USB 드라이버에서 오는가요? COM 프레임 워크? DirectMusic? 내 MIDI 포트의 이름을 읽을 때 사용할 코드 페이지를 어떻게 알 수 있습니까? 정보에 대한

:

  • 나는 코드 페이지를 사용하기위한 인수로 CP_ACPCP_OEMCP로 변환을 수행 할 수 MultiByteToWideChar()WideCharToMultiByte() 기능을 사용합니다. CP_ACP (ANSI) 코드 페이지를 사용하여 나는 MME 하위 시스템에서 MIDI 포트 정보를 얻을 수 midiInGetDeviceCaps()를 사용
  • ...
  • ... 그리고 변환 MIDIINCAPS.szPname. 나는 DirectMusic의에서 포트 정보를 얻을 수 IID_IDirectMusic8::EnumPort()를 사용
  • ...
  • ... 그리고 CP_OEMCP 코드 페이지를 사용하여 DMUS_PORTCAPS.wszDescription을 변환합니다.
+0

코드 예제 나 최소한 사용하고있는 특정 Win32 함수의 이름을 알려주시겠습니까? – user9876

+0

일반적으로이 "OEM 코드 페이지"는 IBM CP437 (미국)입니다. 나머지 시간은 아마도 IBM CP850 (유럽) 일 것입니다. –

답변

0

왜 DirectMusic 프레임 워크가 하나의 코드 페이지 집합과 MME를 사용하는지 모르겠지만 여기에 대한 해결책은 아마 추상화 계층을 작성한 다음 각 API에 대한 특정 구현을 작성하는 것입니다. . 그렇게하면 소프트웨어의 상위 레벨이 이와 같은 세부 사항에 신경을 쓸 필요가 없습니다.

즉, 끝점 이름은 확실히 OS에서 왔습니다. USB MIDI 장치는 끝점 유형 (즉, 입력 또는 출력 및 번호) 만 지정하지만 OS는 적합하다고 생각되는대로 자유롭게 해석하므로 로컬 화됩니다.

프레임 워크가 어떤 코드 페이지를 전달하는지 알아보기 위해 특정 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가 이러한 방식으로 코드 페이지를 설정하는 것은 가능합니다.

0

실제로 이러한 유형의 데이터에 어떤 코드 페이지가 사용되는지 알 수있는 자동 방법이 없습니다.여기를 참조하십시오 : How can I detect the encoding/codepage of a text file

+0

이와 같이, 당신은 할 수 없습니다. 그러나 이는 명시 적 또는 간접적으로 (예 : 드라이버가 항상 OEM 코드 페이지를 사용하기 때문에) 어딘가에 문서화되기를 기대하고있었습니다. –