2013-03-04 4 views
3

WinMain()은 실제로 어떻게 호출됩니까? __startupWinMain()처럼 보이는 (무엇인가) 것으로 시작한 프로 해커들이 사용하는 기능을 기억합니다.실제로 WinMain을 호출하는 함수

문제는 Win32 EXE (/SUBSYSTEM:WINDOWS으로 컴파일 됨)가 있지만 명령 줄에서 인수를 가져 오는 것입니다. 명령 행이 올바르지 않으면, 프로세스는 콘솔에 도움말 메시지를 인쇄해야합니다.

/SUBSYSTEM:WINDOWS 링커 옵션이있는 exe에서 수동으로 할당 해제 (또는 FreeConsole()) 할 수 있습니까?

+0

findstr/spin WinMain ("c : \ Program Files (x86) \ Microsoft Visual Studio 11").0 \ VC \ crt \ src \ * "' –

+1

'WinMain'의 호출자를 알아내는 것으로 잘못된 경로에있을 수 있습니다. 콘솔을 할당하고 표준 출력을 해당 콘솔로 리디렉션하는 것입니다. [Here 's] (http://www.halcyon.com/~ast/dload/guicon.htm) 어떻게 끝났습니까? – Praetorian

+2

/subsystem : windows를 사용할 때 콘솔을 얻지 못합니다. 무엇을 제거하려고하는지 명확하지 않습니다. –

답변

1

아마도 명령 줄이 올바르지 않을 때 프로그램 팝업 메시지 상자를 고려해야합니다. 이런 식으로 뭔가가 :

MessageBox(NULL, "(description of command line error)", 
      "MyProg - Command Line Error", 
      MB_OK|MB_ICONEXCLAMATION); 

이 화면의 중앙에 메시지 상자를 열고 실제로 프로그램을 종료하기 전에 그것을 인정하기를 기다립니다.

한편 콘솔 앱으로 프로그램을 빌드하고 printf()을 사용하여 콘솔에 쓸 수 있습니다. 콘솔 프로그램은 여전히 ​​창을 만들지 만 콘솔에서 분리하는 방법을 알아 내지 않으면 콘솔 자체가 멈 춥니 다. 그러면 printf()을 더 이상 사용할 수 없게됩니다.

3

처음으로 귀하의 프로그램의 행동, 매개 변수를 확인하십시오. 괜찮 으면 정상적으로 계속하십시오.

그렇지 않으면 AttachConsoleATTACH_PARENT_PROCESS으로 전달하십시오. 성공하면 stdout에 오류를 출력하고 종료 할 수 있습니다. 그렇지 않으면 메시지 상자에 오류를 표시해야합니다.

0

컴파일러는 표준 기본 함수 대신 wWinMain을 호출하는 것을 어떻게 알고 있습니까? 실제로 일어나는 일은 Microsoft C 런타임 라이브러리 (CRT)가 WinMain 또는 wWinMain을 호출하는 main 구현을 제공한다는 것입니다. 참고 CRT는 메인 내부에서 몇 가지 추가 작업을 수행합니다. 예를 들어 정적 초기화 프로그램은 wWinMain 전에 호출됩니다. 링커에게 다른 진입 점 기능을 사용하도록 알릴 수는 있지만 CRT에 링크하면 기본값을 사용하십시오. 그렇지 않으면 예기치 않은 결과와 함께 CRT 초기화 코드를 건너 뜁니다. 예를 들어 전역 개체가 올바르게 초기화되지 않습니다.

+0

답변으로 게시했습니다. – Robert

0

WinMain()은 실제로 어떻게 호출됩니까?

디버거에서 프로그램의 첫 줄을 한 번 실행 한 다음 스택을 보면 WinMain이 어떻게 호출되는지 알 수 있습니다. 일반적인 빌드의 실제 시작 함수는 런타임 라이브러리에서 가져온 함수입니다. 나를 위해, 그것은 _WinMainCRTStartup이지만 컴파일러, 링커 및 빌드 라이브러리 버전에 따라 다를 수 있습니다 가정합니다. 런타임 라이브러리의 시작 함수는 초기화를 수행 한 다음 WinMain을 호출합니다.

dumpbin /headers (또는 PE 바이너리를 검사 할 수있는 다른 프로그램)을 사용하면 실행 파일의 "진입 점"을 확인할 수 있습니다. 변경 작업을 수행하지 않으면 _WinMainCRTStartup이 표시되며 이는 스택 추적에서 알려주는 내용과 일치합니다.

귀하의 질문에 답변을 제공해 주실 것이지만 귀하의 문제는 해결되지 않습니다. 다른 사람들이 좋은 해결책을 게시 한 것처럼 보입니다.

관련 문제