MFC로 만든 프로그램 내에서 다른 프로그램을 실행시킬 수 있다.

보통 WinExec()를 많이 쓰는데 이는 실행 명령만 날려주고 스스로는 프로그램을 계속 진행해 나가지만 경우에 따라서 실행시킨 프로그램이 끝난 후에 진행해야 하는 경우도 있다.

그런 경우에 다음과 같은 부분을 쓰면 된다.

 

/****************

SHELLEXECUTEINFO sei;
  ::ZeroMemory( &sei, sizeof(SHELLEXECUTEINFO) );
  
  sei.cbSize = sizeof(SHELLEXECUTEINFO);
  sei.lpFile = "MsiExec.exe";
  sei.lpParameters = "";
  sei.nShow = SW_SHOW;
  sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  sei.lpVerb = "open";
  
  DWORD result = ::ShellExecuteEx( &sei );
  if( sei.hProcess != NULL )
  {
   ::WaitForSingleObject( sei.hProcess, INFINITE ); //여기서 해당 프로세스가 종료될때까지 대기하게됨
  }

******************/

1.SHELLEXECUTEINFO : 프로그램 정보를 가질 구조체이다.

 

2.::ZeroMemory( &sei, sizeof(SHELLEXECUTEINFO) ) : buffer에 해당 변수를 zero(0)로 만든다.

VOID ZeroMemory(
  PVOID
Destination,     // address of block to fill with zeros
  DWORD Length          // size, in bytes, of block to fill with zeros
);

3.ShellExecuteEx(&sei)  : 구조체에 지정한 프로그램을 실행시킨다.
WINSHELLAPI BOOL WINAPI ShellExecuteEx(
    LPSHELLEXECUTEINFO
lpExecInfo
);

 

4.::WaitForSingleObject( sei.hProcess, INFINITE ) : 프로세스가 끝날 때까지 대기한다.

DWORD WaitForSingleObject(
  HANDLE
hHandle,        // handle to object to wait for
  DWORD dwMilliseconds   // time-out interval in milliseconds
);

Posted by pkss
,

AfxMessageBox 총 정리!!

MFC 2011. 4. 8. 09:15

1. MSDN 설명

int AfxMessageBox(
   LPCTSTR lpszText,
   UINT nType = MB_OK,
   UINT nIDHelp = 0 
);
int AFXAPI AfxMessageBox(
   UINT nIDPrompt,
   UINT nType = MB_OK,
   UINT nIDHelp = (UINT) -1 
);
lpszText

Points to a CString object or null-terminated string containing the message to be displayed in the message box.

nType

The style of the message box. Apply any of the < >message-box :Track(?ctl00_MainContent_cpe90361_c|ctl00_MainContent_ctl05?,this);?>to the box.

nIDHelp

The Help context ID for the message; 0 indicates the application's default Help context will be used.

nIDPrompt

A unique ID used to reference a string in the string table.

 

2 . 기본설정

 

int AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0);

 

MessageBox와는 달리 제목을 넣는 부분은 사라졌습니다.

 

Example)

 

AfxMessageBox(“메시지 박스 테스트”, MB_OK | MB_ICONEXCLAMATION);

 

 

nType은 다음 중에서 각각 하나씩 조합해서 사용할 수 있습니다.

 

버튼 스타일                                    의미

MB_ABORTRETRYIGNORE                [취소], [재시도], [무시]

MB_OK                                           [확인]

MB_OKCANCEL                               [확인], [취소]

MB_RETRYCANCEL                         [재시도], [취소]

MB_YESNO                                     [], [아니오]

MB_YESNOCANCEL                         [], [아니오], [취소]

 

 

아이콘 스타일                                  의미

MB_ICONEXCLAMATION                   [느낌표]

MB_ICONINFORMATION                    [느낌표]

MB_ICONQUESTION                          [물음표]

MB_ICONSTOP                                 [X]

 

 

디폴트 버튼                                     의미

MB_DEFBUTTON1                             첫 번째 버튼

MB_DEFBUTTON2                             두 번째 버튼

MB_DEFBUTTON3                             세 번째 버튼

 

 

모달리티                                         의미

MB_APPLMODAL                              메시지 박스를 종료시켜야 프로그램을 계속 진행할 수 있음

MB_SYSTEMMODAL                          메시지 박스를 종료시켜야 시스템을 사용할 수 있음

 

 

반환값                                            의미

IDABORT                                         [취소(Abort)]가 눌러 졌음

IDCANCEL                                       [취소(Cancel)]이 눌러 졌음

IDIGNORE                                        [무시]가 눌러 졌음

IDNO                                               [아니오]가 눌러 졌음

IDOK                                               [확인]이 눌러 졌음

IDRETRY                                          [재시도]가 눌러 졌음

IDYES                                             []가 눌러 졌음

3. 추가 옵션

 

CString temp;

temp.Format(_T("당신의 점수는 %d점입니다."), nScore);

AfxMessageBox(temp);

 

참고 : http://blog.naver.com/cysatan/10047219216

 

4. 기타

 

일일이 창띄워서 확인을 해야한다면 모르겠지만 아니라면

 

TRACE(""); 함수를 써도 괜찮은거같다.

 

괄호 안의 형식은 Afxmessagebox와 비슷하며 출력은 Output창에 표시된다.

 

 

 

출처: 0. http://blog.naver.com/cysatan?Redirect=Log&logNo=10051502240
1. http://msdn.microsoft.com/en-us/library/as6se7cb.aspx

2. AfxMessageBox()를 써 보자

3.  http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=uFAjiv1k4JmCyEjQuiylTjEnq1MrK8xU&qb=YWZ4bWVzc2FnZWJveA==&enc=utf8&section=kin&rank=1&sort=0&spq=0&pid=fCbs6doi5UNsscSEda0sss--387710&sid=SkFx15BeQUoAAAr4MIk 

Posted by pkss
,

MFC 안에서 외부 프로그램을 동작 시킬수 있다는 (획기적인) 방법이 있다는 것을 듣고 직접 실행 시켜 보았습니다. 프로그램안에서 외부 프로그램을 동작 시켜 볼 수 있다는 점에서 참 재미가 있었네요.

1) WinExec 함수

외부 프로그램을 동작 시킬 수 있는 함수들 중에서 제일 먼저 사용된 그래서 오래된 함수(win3.x 버전부터 사용된 함수입니다.)는 WinExec함수입니다. 

이 함수의 프로토 타입은 

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);

으로 사용방법은 아래와 같습니다.

WinExec("C:/Program Files/Internet Explorer/IEXPLORE.EXE",SW_SHOW);
혹은 WinExec("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",SW_SHOW);

로 프로그램안에서 위 함수를 위와 같이 인자를 넣으면 인터넷 익스프롤러가 실행이되는 구문입니다. 

이 함수의 장점은 인자가 2개뿐이어서 사용하기는 간편다는 것이지만,
단점으로는 실행을 시켜 놓으면 실행이 되는지 에러가 났는지, 종료 되었는지 전혀 알수가 없다는 것입니다.

2) CreateProcess 함수

다음은 CreateProcess()의 Prototype입니다.

BOOL CreateProcess(
  LPCTSTR lpApplicationName, // 실행파일 모듈의 이름에 대한 포인터
  LPTSTR lpCommandLine, // 커맨드 문자열에 대한 포인터
  LPSECURITY_ATTRIBUTES lpPA, // 프로세스 보안 속성 포인터
  LPSECURITY_ATTRIBUTES lpTA, // 스레드 보안속성 포인터
  BOOL bInheritHandles, // 핸들 상속 여부 플래그
  DWORD dwCreationFlags, // 생성 플래그
  LPVOID lpEnvironment, // 환경 블록에 대한 포인터
  LPCTSTR lpCurrentDirectory, // 현재 디렉토리
  LPSTARTUPINFO lpStartupInfo, // STARTUPINFO 포인터
  LPPROCESS_INFORMATION lpPI // PROCESS_INFORMATION 포인터
);

이 함수의 실행 방법은 아래와 같습니다.

STARTUPINFO StartupInfo = {0};
PROCESS_INFORMATION ProcessInfo;
StartupInfo.cb = sizeof( STARTUPINFO );
::CreateProcess("C:/Program Files/Internet Explorer/IEXPLORE.EXE",
    NULL, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);

만약 위의 프로그램을 실행시키고 종료하기를 기다린다고 하면,

BOOL ret = CreateProcess(............);
if(!ret)
return FALSE;

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
return TRUE;

이렇게 하면 됩니다.

3) ShellExecute 함수

이 함수의 원형은 아래와 같습니다.

HINSTANCE ShellExecute(
  HWND hwnd, // 부모 윈도우 핸들
  LPCTSTR lpVerb, // 동사 혹은 작업
  LPCTSTR lpFile, // 실행 대상 문서
  LPCTSTR lpParameters, // 컴맨드 인자
  LPCTSTR lpDirectory, // 현재 디렉토리
  INT nShowCmd // 보여주기 옵션
);

일단 위의 함수를 살펴보면 CreateProcess() 함수보다 기능이 많이 떨어지는 것 처럼 보이지만 이 함수의 진정한 의미는 동사 연결이라는 점입니다.
보통 우리가 말하는 [연결 프로그램]을 지칭합니다.

이 함수는 아래와 같이 사용할 수 있습니다.

ShellExecute(NULL,
    "open",
    //"C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",   // 경로가 이렇게도 사용가능
    "C:/Program Files/Internet Explorer/IEXPLORE.EXE",
    NULL,NULL,SW_SHOW);

이 함수는 3번째 인자에 다양한 타입을 열수 있도록 되어 있으므로 다양한 응용이 가능한 함수가 되겠습니다.

출처 : http://karfn84.tistory.com/63
Posted by pkss
,