2012-10-11 2 views
0

Microsoft P/Invoke Interop Assistant 도구를 사용하여 네이티브 C/C++ 코드에서 일부 구조, 대리자 등을 생성했습니다..NET에서 플랫폼 호출에 사용되는 명명 규칙

이들 중 하나의 예입니다 다음과 같은 이름에 관리 코드에 해결하는 함수 포인터 (대표) :

EnumCalendarInfoProcA 
EnumCalendarInfoProcW 
EnumCalendarInfoProcExA 
EnumCalendarInfoProcExW 

사람이 A와 W 및 EXA와 EXW의 차이를 설명 할 수 있습니까?

답변

2

일부 기능에는 여러 가지 형식이 있습니다. Ascii (MessageBoxA) 또는 와이드 char/유니 코드 (MessageBoxW). 함수가 동일하지만 더 많이 수행하면 이름에 대개 'Ex'라는 접미사가 붙어 확장 된 것입니다. 다음 기능 추천

메시지 박스 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

MessageBoxEx : MessageBoxEx이 파라미터 wLanguageId 의해 확장 http://msdn.microsoft.com/en-us/library/windows/desktop/ms645507(v=vs.85).aspx

.

+0

'A'는 'ANSI'의 약자로 Microsoft에서 말하는 "로컬 레거시 인코딩"을 의미하며 실제 ANSI 인코딩을 나타내지는 않습니다. – CodesInChaos

+0

@CodesInChaos 이것은 원래 ANSI 초안을 기반으로 한 인코딩 (http://blogs.msdn.com/b/oldnewthing/archive/2004/05/31/144893.aspx)을 말하며 아마도 OEM/DOS 코드 페이지. 그 점에서 ANSI는 실제로 여전히 틀렸지 만 여러분이 신용을 부여하는 것보다 훨씬 더 정확한 IMO입니다. – hvd

+0

ANSI 설명을 해주셔서 감사합니다! –

2

PInvoke Interop Assistant와 조심해야합니다. 생성 된 선언은 완전히 자동 생성되고 편집되지 않습니다. 결과적으로 상당히 어색한 결과가 나오는 경향이 있습니다. pinvoke.net 웹 사이트 및 MSDN 라이브러리에서 제공되는 것과 같은 편집 된 소스를 비교할 필요가 있습니다.

기능이 문자열을 조작하기 때문에 A 및 W 버전이 존재합니다. 9x 지점의 Windows 이전 버전은 유니 코드를 지원하지 않았습니다. 그들은 8 비트 인코딩 문자가있는 A 버전을 사용했습니다. Windows ME의 신속하고도 합당한 결과와 관련성이 사라졌습니다. 현재까지 실행하게 될 모든 Windows 버전은 NT 분기에서 가져온 것이므로 코어에서 유니 코드를 사용할 수 있습니다.

pinvoke marshaller는 [DllImport] 속성의 CharSet 속성을 기반으로 A 버전과 W 버전 중에서 적절하게 선택하는 방법을 이미 알고 있습니다. 안타깝게도 기본값은 여전히 ​​Ansi입니다. 큰 실수입니다. CharSet.Auto를 지정하고 W없이 이름을 사용해야합니다. EnumCalendarInfoProc은 콜백 프로토 타입이므로 정확한 이름은 실제로 중요하지 않습니다. 위임자로 선언해야합니다. 임의의 이름을 선택할 수 있습니다.

EnumCalendarInfoProc와 EnumCalendarInfoProcEx의 차이점은 MSDN 기사에서 잘 설명되어 있으며 Ex 버전에는 추가 인수가 있습니다. 어느 것을 사용해야하는지는 열거를 시작하는 데 사용하는 API 함수에 의해 결정됩니다. EnumCalendarInfo() 또는 EnumCalendarInfoEx()를 선택하십시오. 후자는 의미가 있습니다. 그리고 ExEx 버전은 Vista 이상에서 사용 가능합니다. 문화가 Microsoft의 Exes를 만드는 기능보다 빠르게 변경됨)

대리자와 함수 선언 모두에 CharSet.Auto를 적용합니다.