프로세스 생성
UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
가장 간단한 프로그램 생성 API. 내부적으로 CreateProcess사용. 자동으로 프로세스 생성시까지 기다려줌
lpCmdLine에는 실행경로를 uCmdShow에는 ShowWindow()와 같은 인자를 넣어준다 일반적으론 SW_SHOWNORMAL.
반환값이 0일 경우 메모리나 리소스가 부족해 프로세스를 생성하지 못한경우고
ERROR_BAT_FORMAT는 지정한 파일이나 실행파일이 아닐경우.
ERROR_FILE_NOT_FOUND 파일이 없을 경우
ERROR_PATH_NOT_FOUND 경로가 없을 경우
DWORD LoadModule(LPCSTR lpModuleName, LPVOID lpParameterBlock);
첫번째 인자에는 실행파일 이름을 두번째 인자는 밑의 구조체를 만들어 넣어준다.
typedef struct tagLOADPARMS32 {
LPSTR lpEnvAddress; // 환경 문자열 ?-_-?
LPSTR lpCmdLine; // 커맨드라인
LPSTR lpCmdShow; // CmdShow값
DWORD dwReserved;
} LOADPARMS32;
역시나 WinExec와 같이 16비트 함수에 더 복잡하기 때문에 거의 쓸일 없음.
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 프로그램 이름. 밑의 명령행으로 지정가능하기 때문에 NULL 가능.
LPTSTR lpCommandLine, // 명령행 인수를 지정. 역시나 위에 지정했으면 NULL가능. 둘중하나는 NULL이 아니어야 한다.
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 보안 속성을 정하는 SECURITY_ATTRIBUTES 구조체이다. NULL로 디폴트설정 가능.
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 보안 속성을 정하는 SECURITY_ATTRIBUTES 구조체이다. NULL로 디폴트설정 가능
BOOL bInheritHandles, // 핸들을 상속받을 수 있는지 설정. 만약 TRUE이면 상속가능한 열려진 핸들은 모두 차일드로 상속됨.
DWORD dwCreationFlags, // 우선권 설정. OR연산으로 중복 조합 가능. 설명 밑에.
LPVOID lpEnvironment, // 환경 블럭이라는데 그냥 NULL로
LPCTSTR lpCurrentDirectory, // 작업 디렉토리 설정. NULL로
LPSTARTUPINFO lpStartInfo, // 이 구조체의 cb멤버에는 구조체의 크기가 대입 되어 있어야 한다. 특별한 일이 없으면 0으로 초기화 되어야 한다.
LPPROCESS_INFOMATION lpProcessinfomation // 생성된 프로세스의 정보를 대입받기 위한 구조체이며 생략 불가능.
);
반환값은 0이면 에러. 아닐경우 GetLastError함수로 살펴 보아야 한다.
DWORD dwCreationFlags의 속성
REALTIME_PRIORITY_CLASS 최상위 우선권
HIGH_PRIORITY_CLASS 상위 우선권
ABOVE_PRIORITY_CLASS 상위 우선권
NORMAL_PRIORITY_CLASS 보통 우선권
BELOW_PRIORITY_CLASS 하위 우선권
IDLE_PRIORITY_CLASS 최하위 우선권
DWORD GetPriorityClass(HANDLE hProcess);
우선권 반환
BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);
우선권 설정
typedef struct _STARTUPINFO {
DWORD cb; // 이 구조체의 크기를 넣어준다.
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR 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;
} STARTUPINFO, *LPSTARTUPINFO;
STARTF_FORCEONFEEDBACK 피드백 커서 사용. 피드팩 커서란 프로그램 초기화때 나타나는 화살표 밑에 모래시계가 있는 커서
STARTF_FORCEOFFFEEDBACK 피드백 커서 사용안함.
STARTF_RUNFULLSCREEN 콘솔프로그램을 전체화면 모드로 실행. GUI프로그램에는 적용 되지 않음.
STARTF_USECOUNTCHARS dwXCountChars 멤버로 콘솔프로그램의 문자폭. dwYCountChars멤버로 문자의 높이 지정. GUI프로그램에는 적용 되지 않음.
STARTF_USEFILLATTRIBUTE dwFillAttribute 멤버로 콘솔 프로그램의 전경, 배경 색상 지정 FOREGROUND_BLUE, BACKGROUND_RED등..
STARTF_USEPOSITION dwX, dwY 멤버로 시작할 프로그램의 위치 지정
STARTF_USESHOWWINDOW wShowWindow 멤버가 지정하는 대로 윈도우를 보여줌.
STARTF_USESIZE dwXSize, dwYSize 멤버가 지정하는대로 크기를 지정함
STARTF_USESTDHANDLES 표준입력, 표준출력, 표준에러핸들을 배치함. 먼저 CreateProcess의 bInheritHandles가 True여야함
GUI프로그램은 dwFlags, dwX, dwY, dwXSize, dwYSize를 사용할수 있다..
크기나 위치를 지정하기 위해서는 목적 프로그램의 크기나 위치에 CW_USEDEFAULT로 설정 되어 있어야 한다.
void GetStartupInfo(LPSTARTUPINFO lpStartupInfo);
생성된 프로세스으 정보를 얻을수 있다.
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; // 프로세스 핸들
HANDLE hThread; // 스레드 핸들
DWORD dwProcessId; // 프로세스 ID
DWORD dwThreadId; // 스레드 ID
} PROCESS_INFORMATION;
CreateProcess는 WinExec와 다르게 바로 리턴한다. 이 경우 FindWindow함수로 못찾을 경우가 있는데 이럴때는
DWORD WaitForInputIdle(HANDLE hProcess, DWORD dwMiliseconds); 로 실행이 끝날때 까지 기다려 줘야 한다.
hProcess로는 CreateProcess함수로 생성시킨 핸들, dwMiliseconds는 기다리는 시간인데 INFINITE로 무한대로 기다릴수 있다.
댓글 없음:
댓글 쓰기