1. 대화상자기반의 새 프로젝트 생성(WorkerThread)

 

2. 버튼 한개 추가 하여 이름(Caption)을 'Button1'에서 'Run 메모장 프로그램'으로 변경함

→ 버튼을 클릭하면 메모장이 실해되도록 할것임

 

3. 버튼을 더블클릭하여 WorkerThreadDlg.cpp에 이벤트 프로시저 추가 후 코드 작성

void CWorkerThreadDlg::OnBnClickedButton1()
{
     TCHAR szWinPath[MAX_PATH];

 

     // 윈도우즈 운영체제가 설치된 디렉토리 경로를 알아내는 함수
     ::GetWindowsDirectory(szWinPath, MAX_PATH);
     // System 32 폴더의 경로는 GetSystemDirectory() API함수 사용
     lstrcat(szWinPath, TEXT("\\notepad.exe"));

 

     SHELLEXECUTEINFO sei;
     ::ZeroMemory(&sei, sizeof(sei));

 

     sei.cbSize = sizeof(sei);
     sei.hwnd = NULL;
     sei.lpFile = szWinPath;
     sei.nShow = SW_SHOW;
     sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE;
     sei.lpVerb = __TEXT("open");
     sei.lpParameters = NULL;

 

     if(::ShellExecuteEx(&sei))
     {
          ::WaitForSingleObject(sei.hProcess, INFINITE);
     }
}



MAX_PATH: 따로 선언하지 않았음에도 윈도우 헤더파일에서 기본적으로 제공해주는 매크로 상수이다.


 ::GetWindowsDirectory(szWinPath, MAX_PATH);
 lstrcat(szWinPath, TEXT("
\\notepad.exe"));

//노트패드의 경로를 가리키는 데 쓰임

 

GetWindowsDirectory(): 윈도우즈 운영체제가 설치된 디렉토리 경로를 알아내는 함수

 

sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE;

→ 콘솔에서 명령프롬포트에 인자값을 줘서 실행시키는 방식으로 실행되는 것. 따라서 콘솔도 같이 실행되고 있는 것이다.

 

ShellExecute(): 특정경로에 있는 프로그램을 실행하게 하는 함수.

구조체를 넣어서 실행하려면 ShellExecuteEx()함수를 사용하고 매게변수로 주소를 가리키면 된다.

 

WaitForSingleObject(): Object가 사라질 때까지 계속 waiting하고 있는 함수

OS가 의도적으로 다른 하나의 프로세스를 격리시킨다. 두개의 스레드가 충동하는 것을 막기 위한 것.(데이터동기화 같은 원리)

 

프로그램의 '응답없음' → 메시지 루프문이 더이상 돌지 않고 가만히 있을 때(프로세스가 메시지를 처리하지 못할때)발생

Posted by 마마필로 :