Windows/Windows API

프로그램 실행 (CreateProcess)

aucd29 2013. 10. 1. 18:59
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="CreateProcess";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
         ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;
    
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

typedef struct tagLOADPARMS32 {
    LPSTR lpEnvAddress; // address of environment strings
    LPSTR lpCmdLine;     // address of command line
    LPSTR lpCmdShow;     // how to show new program
    DWORD dwReserved;    // must be zero
} LOADPARMS32;

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    char Mes[] = "마우스 왼쪽 버튼을 누르면 메모장을 실행합니다";
    LOADPARMS32 lp;
    char CmdLine[2]={0,};
    WORD CmdShow[2]={2,SW_SHOWNORMAL};
    STARTUPINFO si={0,};
    PROCESS_INFORMATION pi;
    char Path[MAX_PATH];
    HWND h;

    switch(iMessage) {
    case WM_LBUTTONDOWN:
/*
        // 프로세스를 생성하는 가장 간단한 방법
        WinExec("Notepad.exe",SW_SHOWNORMAL);
//*/

/*
        // LoadModule 함수를 사용하는 방법
        lp.lpEnvAddress = NULL;
        lp.lpCmdLine = CmdLine;
        lp.lpCmdShow = (LPSTR)&CmdShow;
        lp.dwReserved = 0;
        LoadModule("Notepad.exe",&lp);
//*/

//*
        // CreateProcess 함수
        si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;
        si.dwX = 100;
        si.dwY = 50;
        si.dwXSize = 640;
        si.dwYSize = 480;

        if (CreateProcess(NULL, "NotePad.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) {
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
//*/

        // 첫번째 인수 사용예
        // GetWindowsDirectory(Path, MAX_PATH);
        // strcat(Path, "\\NotePad.exe");
        // CreateProcess(Path, NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);

        // 두번째 인수로 명령행 인수를 전달하는 예
        // CreateProcess(NULL, "NotePad.exe c:\\Autoexec.bat", NULL, NULL, FALSE, 0, NULL, NULL,&si,&pi);

        // 첫번째 인수와 두번째 인수를 같이 사용하여 명령행 인수를 전달하기
        // GetWindowsDirectory(Path, MAX_PATH);
        // strcat(Path, "\\NotePad.exe");
        // CreateProcess(Path, " c:\\Autoexec.bat",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd, &ps);
        TextOut(hdc,50,50,Mes,strlen(Mes));
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}