2013-04-21 2 views
3
나는 오래된 bcc32을 사용하고

(볼랜드 5.5) (나는이 컴파일러 아주 오래 알고 있지만 나는 그것을 사용하지 않는해야 말하지 않는다)bcc32 - 아니 콘솔 서브 시스템과도없이 윈도우 서브 시스템

내가 컴파일 할 수 있습니다 콘솔 또는 windows 서브 시스템. 나는 윈도우 서브 시스템과 컴파일하지 않으

, 난 그냥 주() 광고와 콘솔을 원하는 어떤 "WINDOWS.H"(I 창을 열고 을 처리하는 내 자신의 라이브러리를 호출 거기에서 포함 내부적으로 자신의 메시지 펌프)

그것은 작동하지만 문제는 내가 콘솔 서브 시스템이 추한 블루 콘솔 를 컴파일 할 때 창이 나타납니다 그냥 내가

그래서 난 그냥 더 필요하다고 생각 없다고 필요가 없습니다 Windows 하위 시스템 컴파일, 콘솔 하위 시스템을 컴파일하지 않고 그냥 내 프로그램을 원시 모드로 컴파일하십시오 (모두 콘솔 creatuion 및 witn WinMain 엔트리 포인트 없음 - 수행 방법).

답변

5

일반적으로 콘솔을 원하지 않는 경우 개발 환경에서 호출하는대로 "GUI"또는 "Windows"하위 시스템을 선택해야합니다. 링커가 EXE 헤더에서 설정하는 비트를 제어합니다. OS가 EXE 파일을 읽고 프로그램에서 코드를 실행하기 전에 사용할 서브 시스템을 결정하기 때문에 프로그램이 실행 된 후에 서브 시스템을 제어 할 수 없습니다.

Windows 하위 시스템을 사용하는 경우에는 창을 사용할 필요가 없습니다. OS가 콘솔을 필요로하지 않는 프로그램을로드 할 때 알려줍니다. Windows API를 사용하는지 여부와 아무 관련이 없습니다. 두 서브 시스템 모두 본격적인 Windows 응용 프로그램이며 Windows API 기능을 모두 사용합니다.

main에서 가능한 한 동일한 작업을 모두 WinMain에서 수행 할 수 있습니다. fetching the command linesplitting it into separate arguments에 대한 기능이 있습니다.

그러나 주 기능을 WinMain이라고 부르지 않으려면 Windows 하위 시스템을 사용할 수 없습니다. 서브 시스템의 선택은 링커가 프로그램에 넣을 준비 코드 세트를 제어합니다. 준비 코드는 프로그램의 실제 진입 점이 존재하는 곳이며 C++ 표준 라이브러리를 초기화하고 네임 스페이스 범위가있는 모든 객체의 생성자를 호출합니다. 콘솔 모드에 포함 된 코드는 main (또는 wmain)을 호출합니다. Windows 서브 시스템에 링크 된 코드는 WinMain (또는 wWinMain)을 호출합니다. Windows 하위 시스템을 사용하고 WinMain이라는 함수를 정의하지 않으면 연결시 오류가 발생합니다. 링커는 정의되지 않은 함수에 대해 불평 할 것입니다. (당신은 헤더의 포함 당신이 두려워 어떤 경우 WINDOWS.H WinMain을 정의하기 위해 포함 할 필요가 없습니다.)

사용하는 하위 시스템이 EXE 헤더의 비트 만 세트이기 때문에, 당신은 the editbin program으로 링크가 발생한 후에 그것을 변경합니다. 당신이 연결할 때, 콘솔 준비 코드와 main를 얻을 수 있도록 콘솔 서브 시스템을 선택하고 대신 윈도우 서브 시스템을 사용하는 바이너리를 수정 :

 
link foo.obj /out foo.exe /subsystem:CONSOLE 
editbin /subsystem:WINDOWS foo.exe 

그런 다음 프로그램이 콘솔없이 실행됩니다.시작하는 동안 문제가 발생하면 준비된 코드는 콘솔에 쓸 수 있다고 예상했기 때문에 프로그램이 중단 될 수 있지만 거기에는 없을 것입니다.

+0

하지만 "windows.h"를 포함하고 싶지 않고 WinMain 진입 점을 원하지 않습니다. "my_own_framework.h"를 포함시키고 간단한 main() 함수를 포함하고 싶습니다. - concole subsystem으로 작동합니다. 완벽하게 잘되었지만이 콘솔이 나타납니다 : c Windows 하위 시스템을 사용할 수 있습니까? Windows h를 포함하지 않고 WinMain을 사용하지 마십시오 - main()은 내가 기억하는 한 컴파일 오류를 나타냅니다. –

+2

@grungefightr : 콘솔 앱에'main()'진입 점이 있고 콘솔 창은 OS에 의해 생성되지 않습니다. 실제로 코드에서 GUI를 만들지 여부와 관계없이 콘솔 창을 제거하려면 'WinMain()'진입 점이있는 GUI 응용 프로그램을 만들어야합니다. Windows가 작동하는 방식입니다. –

+0

콘솔 모드의 exe 스타트 스텁이 CreateConsole API 호출과 같은 것을 호출하는 것으로 의심됩니다. 단지 전화하지 않는 것이 좋을 것입니다. - 저주받은 콘솔과 빌어 먹을 WinMain이 필요하지 않습니다. : c –

관련 문제