A프로그램에서 NotePad를 실행한뒤
해당 노트패드의 processId를 전송하여
B프로그램에서 NotePad를 제어하는 방법
A 프로그램에서 프로세스 생성
void Call_Process()
{
HWND hProcB;
PROCESS_INFORMATION pi; //프로세스 INFORMATION
STARTUPINFO si; //시작정보
ZeroMemory(&si,sizeof(STARTUPINFO)); //메모리 초기화
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); //메모리 초기화
static char Status[256];
hProcB = ::FindWindow(NULL,"B프로그램");
if (hProcB == NULL)
{
MessageBox("B프로그램을 실행하십시오.","경고",MB_OK);
}else{
si.cb = sizeof(STARTUPINFO);
si.dwFlags = START_USEPOSITION | STARTF_USESIZE;
si.dwX = 50;
si.dwY = 650;
si.dwXSize = 640;
si.dwYSize = 100;
if (CreateProcess(NULL"notepad.exe",NULL,NULL,FALSE,0,NULL,&si,&pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
::SendMessage(hProcB,WM_USER+1,(WPARAM)pi.dwProcessId,0);
sprintf(Status,"프로세스 핸들 %u와\r\nID %u를
생성했습니다.",pi.hProcess,pi.dwProcessId);
SendDlgItemMessage(TXT_SP,WM_SETTEXT,strlen(Status),(LPARAM)Status);
}
}
B프로그램에서 프로세스 받아서 제어
#define WM_BOX WM_USER+1
HANDLE hProc;
DWORD ProcID;
DWORD ExitCode;
void OnBoxEvent(WPARAM wp,LPARAM lp)
{
char Status[256];
char str[256];
ProcID=wp;
hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcID);
wsprintf(Status,프로세스 ID로 %u를 받았으며\r\n이
ID로부터 프로세스핸들 %u를 열었습니다",ProcID,hProc);
SendDlgItemMessage(TXT_EDIT,WM_SETTEXT,strlen(Status),(LPARAM)Status);
}
프로세스 종료
void OnExitProcess()
{
//프로세스의 종료상태를 체크
GetExitCodeProcess(hProc,&ExitCode);
if (ExitCode != STILL_ACTIVE){
MessageBox("프로세스 핸들이 무효합니다","알림",NULL);
}else{
sprintf(str,"%u 핸들을 가진 프로세스를 종료하겠습니다",hProc);
MessageBox(str,"알림",MB_OK);
TerminateProcess(hProc,0);
ProcID=0;
}
}
실행해보면 프로그램 A 와 B가 가진 ID는 동일하되 프로세스 핸들은 서로 다를수 있다는 것이다.
프로세스 핸들은 한정적이고 프로세스 ID는 시스템 전역적이다. 이는 스레드 핸들과 스레드
ID에도 동일하게 적용된다.
'개발언어 > c++' 카테고리의 다른 글
CString Format 문으로 원화 또는 달러 등과 같은 통화 단위로 표기 하기 (0) | 2016.07.18 |
---|---|
가변적으로 부동솟수점 표현하기(소수점 자리수를 입력받은 만큼 보여주기) (0) | 2016.07.18 |
강제 메모리 해제 (0) | 2016.07.18 |
처리되지 않은 예외(Exception) 핸들링 (0) | 2016.07.18 |
MFC로 작성한 프로그램에서 폴더선택 하기 (0) | 2016.07.18 |