source

창이 없는 응용프로그램 만들기

ittop 2023. 9. 24. 13:05
반응형

창이 없는 응용프로그램 만들기

창이나 콘솔을 열지 않고 실행할 수 있는 C/C++ 애플리케이션을 어떻게 프로그래밍하시겠습니까?

WinMain 프로그램을 작성할 때 컴파일러의 window가 되는 /SUBsystem 옵션이 자동으로 표시됩니다(Visual Studio를 사용한다고 가정).다른 컴파일러의 경우에도 비슷한 옵션이 있지만 플래그 이름은 다를 수 있습니다.

그러면 컴파일러가 실행 파일을 윈도우즈 실행 파일로 표시하는 실행 파일 형식(PE 형식)의 항목을 만듭니다.

이 정보가 실행 파일에 있으면 프로그램을 시작하는 시스템 로더는 바이너리를 콘솔 프로그램이 아닌 윈도우 실행 파일로 취급하므로 실행 시 콘솔 창이 자동으로 열리지 않습니다.

그러나 작업 표시줄에서 실행 중인 모든 프로그램 및 서비스와 마찬가지로 Windows(윈도우) 프로그램이 필요 없는 경우에는 창을 만들 필요가 없지만 해당 창이 표시되지는 않습니다.창을 만들지만 표시하지 않도록 선택한 경우에도 이 문제가 발생할 수 있습니다.

이 모든 걸 달성하기 위해서는

#include <Windows.h>

int WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance, 
            LPTSTR    lpCmdLine, 
            int       cmdShow)
    {
    /* do your stuff here. If you return from this function the program ends */
    }

WinMain 자체가 필요한 이유는 하위 시스템을 Windows(윈도우)로 표시하면 링커는 프로그램이 로드되고 C Run TIME 라이브러리가 초기화된 후 호출되는 진입점 함수가 메인이 아닌 WinMain(윈메인)이라고 가정하기 때문입니다.이러한 프로그램에서 WinMain을 제공하지 않으면 링크 과정에서 해결되지 않은 심볼 오류가 발생합니다.

창에서:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // <-- Program logic here
    return 0;
}   

Adam Mitz가 언급한 대로 /SUBsystem linker 스위치를 사용해야 합니다.

기타 플랫폼의 경우:

int main(int argc, char**argv)
{
  // <-- Program logic here
  return 0;
}

콘솔이나 창이 없이 프로그램을 계속 실행해야 하는 경우 *NIX에서 유용한 디아몬이나 Windows에서 서비스를 찾을 수 있습니다.만약 당신이 평범한 win32가 필요하다면, 샘플을 위해 약간의 구글을 사용하세요.
win32로 태그가 지정된 질문이므로 서비스가 고객님께 더 적합하다고 생각합니다.

메시지도 처리합니다.

#include <windows.h>
#include <stdio.h>

int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg;
    DWORD curThreadId;

    curThreadId = GetCurrentThreadId();

    // Send messages to self:
    PostThreadMessage(curThreadId, WM_USER, 1, 2);
    PostThreadMessage(curThreadId, WM_USER+1, 3, 4);
    PostThreadMessage(curThreadId, WM_USER+2, 5, 6);
    PostThreadMessage(curThreadId, WM_USER+3, 7, 8);
    PostThreadMessage(curThreadId, WM_QUIT, 9, 10);

    while (GetMessage(&msg, NULL, 0, 0)) {
        printf("message: %d; wParam: %d; lParam: %d\n", msg.message, msg.wParam, msg.lParam);
    }

    return (int) msg.wParam;
} 

하위 시스템을 윈도우로 설정한 후 Visual Studio Express 2010에서(사용자 17224 및 Brian R이 제안한 대로) 메인을 WinMain으로 변경하는 대신(사용자 17224 및 Brian R이 제안한 대로).Bondy), 입력 기능을 main 속성, linker, advanced, entry point로 설정할 수 있습니다: 텍스트 상자에 main을 입력하기만 하면 됩니다.

Visual Studio 마법사를 사용하여 Win32 응용 프로그램을 만듭니다.그러나 창을 만들지 마십시오. 즉 창 만들기 기능을 제거합니다.또는 Win Service 애플리케이션을 만들 수도 있습니다.

MSVC 또는 Visual Studio를 사용하는 경우 새 Project Wizard(프로젝트 마법사)를 사용하고 콘솔 애플리케이션을 선택합니다.

언급URL : https://stackoverflow.com/questions/224225/create-an-application-without-a-window

반응형