2010-08-24 2 views
3

다른 Windows C 항목 포인터, wmain 및 WinMain에 대한 기사는 거의 읽지 않았습니다.wmain 대 메인 C 런타임

내가 맞으면 Windows OS 용 C 언어 컴파일러에 추가됩니다. 그러나 어떻게 구현됩니까?

예를 들어 wmain은 argv []와 같은 유니 코드를 가져 오지만 이러한 인수를 프로그램에 전송하는 Os는 유니 코드로 arguemnts를 전달하는 Windows에 대한 .exe 파일 항목에 특별한 필드가 있습니까? 감사.

답변

4

최신 Windows 버전은 내부적으로 UTF-16을 사용합니다. 따라서 실행 파일을 실행하면 모든 명령 줄 인수가 UTF-16으로 전달되고 발급 된 응용 프로그램에 연결된 런타임 라이브러리는 상수를 통해 인수를 전달하거나 (wmain을 사용하는 경우) 인수를 로컬 인코딩으로 변환합니다 자동으로 (main을 사용하는 경우). (특히 이것은 콘솔 Windows 응용 프로그램에 사용되는 실제 진입 점인 wmainCRTStartup/mainCRTStartup으로 수행됩니다.)

2

첫 번째 : 유창한 말 : wmain은 확실히 유니 코드 인수를 얻지 못합니다. 어떤 특정 인코딩의 것일 수있다. wmain은 유니 코드의 16 비트 문자 인코딩 인 UTF-16을 인수로 사용합니다. 필자는 wmain에 대한 Microsoft의 설명서와이 설명서의 링크를 확인한 결과, Microsoft가 유니 코드를 작성한 시점에 대한 단서가 없다는 사실이 분명해졌습니다.

어쨌든 프로그램의 진입 점은 링커에 의해 정의됩니다. C 프로그램에는 항상 main/wmain/WinMain/wWinMain 이전에 실행되는 프롤로그 코드가 있습니다. 메인의 와이드 버전 중 하나가 사용되면 프롤로그 코드는 환경의 문자를 문자 세트에서 와이드 문자 버전으로 변환합니다.

+2

Windows NT는 UCS-2를 사용하여 내부적으로 시작되었지만 최신 버전은 주로 UTF-16을 사용합니다 왜 문서가 명시 적으로 명확하지 않은지. 또한 호출자가 제공 한 UTF-16 인수가 로컬 인코딩과의 중간 변환을 통과하고 Windows가 지원하지 않기 때문에 프롤로그 코드가 로컬 인코딩에서 UTF-16으로 변환되지 않을 가능성이 있습니다 UTF-8을 로컬 인코딩으로 사용하면 손실이 발생할 수 있습니다. 그러므로 저는 그것이 다른 방향이라고 믿습니다. – jamesdlin

+0

@ jamesdlin : Microsoft에서 작성한 문서를 읽었습니다. 캐릭터 세트가 이미 UTF-16 인 경우, 변환 핸들을 적용하지 않아도 캐릭터 처리 코드가 훌륭하다고 상상해보십시오. – JeremyP

+0

처음에는 UTF-16 데이터가없는 한 프롤로그 코드가 문자가 UTF-16인지 여부를 어떻게 알 수 있습니까? – jamesdlin