Winmain을 사용하지 않고 Windows 애플리케이션을 어떻게 작성할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/564576

  •  05-09-2019
  •  | 
  •  

문제

C/C ++로 작성된 Windows GUI 애플리케이션에는 '메인'이 아닌 출입구로 'winmain'이 있습니다. 이것에 대한 나의 이해는 컴파일러가 C 런타임에서 호출 할 '기본'함수를 생성한다는 것입니다. 이 '기본'기능은 GUI에 필요한 환경을 설정하고 'winmain'(인스턴스 핸들을 지정하는 등)으로 호출합니다.

요컨대, 콘솔 및 GUI 애플리케이션 시작이 다음과 같은 방식으로 다르다고 생각합니다.

콘솔 애플리케이션 : C 런타임-> '기본'기능 (핸드 코딩)

GUI 애플리케이션 : C 런타임-> '기본'함수 (컴파일러 생성)-> 'winmain'함수 (손으로 코딩)

이 이해를 검증하고 '메인'기능만으로 Windows GUI를 직접 코딩 할 수있는 방법을 알고 싶습니다 (즉, 'Winmain'을 쓰지 않아도).

도움이 되었습니까?

해결책

당신은 잘못된 이해가 있습니다. Main과 Winmain의 차이점은 일부 차이 초기화 코드와는 별도로 전달 된 매개 변수입니다.

메인은 다음과 같습니다.

int main(int argc, char* argv[]);

Winmain은 다음과 같습니다.

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

해당 매개 변수를 설정하고 호출 해야하는 것이 있어야합니다. 이것이 시작 코드입니다. 프로그램을 컴파일하고 연결하면 링커 매개 변수 중 하나는 진입 점이며, 이는 콘솔 또는 GUI 앱에 따라 다른 시작 코드입니다.

당신은 확실히 자신의 시작 코드를 작성하고, 시각적 C ++ 소스 디렉토리로 이동하면 시작 코드를 찾을 수 있습니다. Crt0.c라고하며 VC CRT SRC 디렉토리에 있습니다.

다른 팁

메인만으로는 Winmain을 코딩 할 수 없습니다. 정당화를 위해, 다음 진술을 가져 왔습니다 http://blogs.msdn.com/oldnewthing/archive/2007/12/03/6644060.aspx

Windows Programming에서] 응용 프로그램 입력 지점이 Main이라고 불리는 이유는 무엇입니까? 글쎄, 한 가지, Main이라는 이름은 이미 취해졌으며 Windows는 대체 정의를 예약 할 권한이 없었습니다. 당시 C 언어 표준화위원회는 없었다. C는 Dennis가 말한 것이며, Dennis는 향후 C 언어의 모든 버전에서 Windows 소스 코드 호환성을 보존하기위한 특별한 조치를 취할 것이라는 보장이 거의 없었습니다. K & R은 구현이 주요 기능의 허용되는 형태를 확장 할 수 있다고 지정하지 않았기 때문에, 메인을 잘못 선언하는 프로그램을 거부하는 법적 C 컴파일러가있을 가능성이 전적으로 가능했습니다. 현재 C 언어 표준은 메인에 대한 구현 별 대체 정의를 명시 적으로 허용하지만, Windows 프로그램을 컴파일하기 위해이 새로운 Windows 특정 버전을 지원하도록 요구하면 Windows 프로그램 작성에 사용할 수있는 컴파일 세트를 적절하게 제한 할 수 있습니다.

그 장애물을 극복 할 수 있다면 Main의 Windows 버전이 다음과 같은 문제가 될 것입니다.

int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);

C 연결이 수행되는 방식으로 인해 함수의 모든 변형은 공통적으로 가지고있는 매개 변수에 동의해야했습니다. 이는 Windows 버전이 가장 긴 기존 버전의 메인 버전의 끝에 매개 변수를 추가해야한다는 것을 의미하며, 손가락을 건너 C 언어가 다른 대체 버전의 메인 버전을 추가하지 않기를 바랍니다. 이 길을 갔다면, 당신의 교차 손가락이 당신을 실패했습니다. 왜냐하면 그것은 얼마 후에 세 번째 매개 변수가 메인에 추가되었고, 당신의 Windows 친화적 인 버전과 충돌했기 때문입니다.

Dennis가 메인의 3 파라미터 버전을 허용하지 않도록 설득했다고 가정 해 봅시다. 여전히 첫 두 매개 변수를 제시해야합니다. 즉, 모든 프로그램의 시작 코드에는 명령 줄 파서가 포함되어야합니다. 16 비트로 돌아가서 사람들은 모든 바이트를 절약하기 위해 긁혔습니다. 그들에게 "아, 그리고 모든 프로그램이 2KB 더 커질 것"이라고 말하면 아마도 많은 친구가되지 않을 것입니다. 내 말은, 그것은 플로피 디스크에서 I/O의 4 개 부문입니다!

그러나 Windows 진입 점에 다른 이름이 주어진 이유는 다른 실행 환경임을 강조하는 것입니다. Main이라고 불리는 경우 사람들은 콘솔 환경을 위해 설계된 C 프로그램을 가져 와서 Windows 컴파일러에 던지고 비참한 결과로 실행합니다.

이것이 당신의 의심을 없애기를 바랍니다.

다른 방식으로 작동합니다. 실제 진입 점을 보유하는 컴파일러와 함께 제공되는 정적으로 연결된 객체 파일이 있습니다. 해당 진입 지점은 초기화를 수행 한 다음 진입 점 (예 : Winmain)을 호출합니다.

그 정적 부분이 호출 할 것으로 예상되는 것은 조정할 수 있습니다. 예를 들어, Visual Studio에는 링커 설정의 진입 점 이름에 대한 필드가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top