본문으로 바로가기

프로세스간의 간단한 통신

category 개발언어/c++ 2016. 7. 18. 06:50

 

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에도 동일하게 적용된다.