728x90

프로세스 생성 함수

- createProcess()

BOOL CreateProcess(
  LPCSTR                lpApplicationName,			// 실행파일 이름
  LPSTR                 lpCommandLine,				// 매개변수 정보
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFO         lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

- STARTUPINFO 구조체 : 생성하고자 하는 프로세스 특성 정보를 전달하는 구조체

- 구조체 변수 크기를 할당하는 이유 : 함수의 전달인자가 다른 것도 올 수 있게 호환성을 고려함. 구조체를 구분지음

typedef struct _STARTUPINFOA {
  DWORD  cb;				// 구조체 변수 크기
  LPSTR  lpReserved;
  LPSTR  lpDesktop;
  LPSTR  lpTitle;			// 타이틀바 제목
  DWORD  dwX;
  DWORD  dwY;
  DWORD  dwXSize;
  DWORD  dwYSize;
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;	    		// 프로세스 윈도우 설정
  DWORD  dwFillAttribute;
  DWORD  dwFlags;			// 설정된 멤버 정보
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;

#ifdef UNICODE
typedef STARTUPINFOW STARTUPINFO;
typedef LPSTARTUPINFOW LPSTARTUPINFO;
#else
typedef STARTUPINFOA STARTUPINFO;
typedef LPSTARTUPINFOA LPSTARTUPINFO;
#endif // UNICODE

- PROCESS_INFORMATION : 생성된 프로세스 정보를 담는 구조체

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

 

프로세스 생성 예제

- AdderProcess.cpp

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	DWORD val1, val2;
	val1 = _ttoi(argv[1]);	
	val2 = _ttoi(argv[2]);
	// 문자열 데이터 -> 정수형 데이터 변환 (atoi, _wtoi 동시 지원 매크로)

	_tprintf(_T("%d + %d = %d \n"), val1, val2, (val1 + val2));
	_gettchar();

	return 0;
}

- CreateProcess.cpp

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

#define DIR_LEN MAX_PATH+1

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION	pi;

	si.cb = sizeof(si);	// 구조체 사이즈 설정
	si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;	// 세팅하는 좌표 및 크기를 사용할 것
	si.dwX = 200;
	si.dwY = 300;
	si.dwXSize = 400;
	si.dwYSize = 400;	// 생성되는 프로세스 윈도우 설정
	si.lpTitle = _T("Creat Process Example");		// 에러 발생 시 준수모드 아니오로 설정

	TCHAR command[] = _T("AdderProcess.exe 10 20");		// AdderProcess.exe 실행 명령어
	TCHAR cDir[DIR_LEN];
	BOOL state;

	GetCurrentDirectory(DIR_LEN, cDir);		// 현재 디렉토리 경로
	_fputts(cDir, stdout);
	_fputts(_T("\n"), stdout);

	SetCurrentDirectory(_T("C:\\Users\\SYPark\\Documents\\Github"));	
    // 디렉토리 변경 AdderProcess.exe는 이 경로에 있어야 함

	GetCurrentDirectory(DIR_LEN, cDir);
	_fputts(cDir, stdout);
	_fputts(_T("\n"), stdout);

	state = CreateProcess(
		NULL, 
		command, // 실행 명령어
		NULL, 
		NULL, 
		TRUE, 
		CREATE_NEW_CONSOLE, // 새로운 콘솔을 생성하는 플래그
		NULL, 
		NULL, 
		&si, 
		&pi
	);	// 프로세스 생성

	if (state != 0)
	{
		_fputts(_T("Creation OK! \n"), stdout);
	}
	else
	{
		_fputts(_T("Creation Error \n"), stdout);
	}

	return 0;
}

- AdderProcess.cpp를 먼저 Release 모드로 exe 파일을 만들어 준 다음 exe 파일을 설정한 링크에 넣고 CreateProcess.cpp 를 실행해야 함

728x90

+ Recent posts