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
'Programming > System Programming' 카테고리의 다른 글
윈도우즈 시스템 프로그래밍 - 6. 커널 오브젝트와 오브젝트 핸들(2) (0) | 2020.07.16 |
---|---|
윈도우즈 시스템 프로그래밍 - 6. 커널 오브젝트와 오브젝트 핸들(1) (0) | 2020.07.16 |
윈도우즈 시스템 프로그래밍 - 5. 프로세스의 생성과 소멸(1) (0) | 2020.07.15 |
윈도우즈 시스템 프로그래밍 - 4. 컴퓨터 구조에 대한 두 번째 이야기(4) (0) | 2020.07.12 |
윈도우즈 시스템 프로그래밍 - 4. 컴퓨터 구조에 대한 두 번째 이야기(3) (0) | 2020.07.12 |