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가 의도적으로 다른 하나의 프로세스를 격리시킨다. 두개의 스레드가 충동하는 것을 막기 위한 것.(데이터동기화 같은 원리)
프로그램의 '응답없음' → 메시지 루프문이 더이상 돌지 않고 가만히 있을 때(프로세스가 메시지를 처리하지 못할때)발생
'PROGRAMMING > MFC(C++)' 카테고리의 다른 글
[0415수업] UIThread(Suspend Thread, Resume Thread) (0) | 2011.04.15 |
---|---|
[0415수업] Thread (0) | 2011.04.15 |
[0414수업] CallConvention(__cdecl, __stdcall, __fastcall) (0) | 2011.04.14 |
[0414수업] SaveGray (0) | 2011.04.14 |
[스크랩] bitmap 강의 내용 정리 (0) | 2011.04.14 |