개요 |
|||||||||||||||
외부프로그램 실행시키는 함수 3개(CreateProcess, ShellExecute,WinExec) 비교 및 CreateProcess 사용법 상세. 비교. WinExec - window3.1 때부터 제공된 함수이며 하위 호환성 때문에 아직도 남아있는것 MS에서는 이 함수 대신 CreateProcess 사용 권장. - UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow) 인자1:실행할 프로그램 커맨드라인. 인자2:실행시 윈도우 상태 보이기 안보이기등 지정. CreateProcess - 실행옵션 미세 설정가능. 실행시킬 때 인자전달 가능. - 반환값 : 대상프로그램이 실행되면 0 아닌값 , 실행되지 않으면 0반환. - 대상프로그램의 실행여부,실행실패원인,종료여부 확인가능. 더보기
CreateProcess()의 프로토 타입.
반환값 : 0 = 외부 프로그램이 실행되지 않음. 0아닌값 : 외부프로그램이 실행됨. 반환값 0이어서 실패한 경우 에러정보 볼려면 GetLastErroe를 호출하라. 이 함수는 대상 프로세스의 실행과정 finish 되기 전에 리턴된다. 만일, 실행시킨 프로세스가 실행 실패한다면 프로세스가 terminated될 수있다. CreateProcess 호출하여 리턴된 이후, 실행시킨 프로세스의 termination status를 확보할려면 GetExitCodeProcess를 호출하라. 인자 lpApplicationName 실행시킬 프로그램 이름. 찾기순서: CreateProcess 함수를 호출한 프로그램이 있는 폴더, 현재폴더, 윈도우폴더, 윈도우시스템폴더, PATH에 설정된 플더순서로 찾기함. 실행파일 정보를 인자 lpCommandLine 으로 입력하는 경우엔 본 인자엔 NULL 기록하면됨. lpCommandLine 실행시킬 커맨드 라인. 최대 32,768 문자까지 가능, lpApplicationName 으로 정보 전달시 이것은 NULL로 해도됨. MSDN도움말 중에 유용한것만 그대로도 가져온다. lpApplicationName, lpCommandLine 2개 모두 NULL이 아닌 경우, the null-terminated string pointed to by lpApplicationName specifies the module to execute, and the null-terminated string pointed to by lpCommandLine specifies the command line. If lpApplicationName is NULL, the first white space–delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin (see the explanation for the lpApplicationName parameter). If the file name does not contain an extension, .exe is appended. Therefore, if the file name extension is .com, this parameter must include the .com extension. If the file name ends in a period (.) with no extension, or if the file name contains a path, .exe is not appended. If the file name does not contain a directory path, the system searches for the executable file in the following sequence:
lpStartupInfo STARTUPINFO 에는 프로세스를 실행시킬때 시작 정보를 담는 구조체이다. 구조체멤버를 보면 사이즈 라든가 ..윈도우의 Enable상태 등등 여러 정보가 있고, 이를 사용자가 설정가능하다. 필요시 STARTUPINFO 멤버값을 설정하여 프로세스가 다른 모습으로 실행될 수 있다. 멤버설정없이 프로세스 호출하면 해당프로세스의 셋팅값으로 생성된다. 보통은 별도로 설정할 일이 없음. lpPI 프로세스 정보를 반환해주기 위한 구조체의 포인터. 프로그램이 성공적으로 실행되면 실행된 프로세스에 대한 정보를 PROCESS_INFORMATION 구조체 형태로 넘겨받을 수 있다. 이를 이용하여 프로세스를 제어할 수 있다. PROCESS_INFORMATION 구조체의 멤버. HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; hProcess : 실행된 프로그램의 프로세스 핸들. 이를 이용하여 프로세스를 제어가능하다. 예로,TerminateProcess 함수를 이용하여 새로 생성시킨 프로세스를 종료시킬 수 있다. WaitForSingleObject(pi.hProcess,INFINITE) 이용하여 프로세스 종료완료 확인가능. hThread : 실행된 프로그램의 주 스레드 핸들. dwProcessId : 프로세스 아이디. dwThreadId : 스레드 아이디. ============================================================================================== 아래는 MSDN 도움말. CreateProcess Creates a new process and its primary thread. The new process runs in the security context of the calling process. If the calling process is impersonating another user, the new process uses the token for the calling process, not the impersonation token. To run the new process in the security context of the user represented by the impersonation token, use the CreateProcessAsUser or CreateProcessWithLogonW function. SyntaxC++
Copy BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _In_ LPSTARTUPINFO lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation );
Parameters
Return valueIf the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, call GetLastError. Note that the function returns before the process has finished initialization. If a required DLL cannot be located or fails to initialize, the process is terminated. To get the termination status of a process, call GetExitCodeProcess. RemarksThe process is assigned a process identifier. The identifier is valid until the process terminates. It can be used to identify the process, or specified in the OpenProcess function to open a handle to the process. The initial thread in the process is also assigned a thread identifier. It can be specified in the OpenThread function to open a handle to the thread. The identifier is valid until the thread terminates and can be used to uniquely identify the thread within the system. These identifiers are returned in the PROCESS_INFORMATION structure.The name of the executable in the command line that the operating system provides to a process is not necessarily identical to that in the command line that the calling process gives to the CreateProcess function. The operating system may prepend a fully qualified path to an executable name that is provided without a fully qualified path. The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process. The preferred way to shut down a process is by using the ExitProcess function, because this function sends notification of approaching termination to all DLLs attached to the process. Other means of shutting down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads of the process are terminated without an opportunity to execute any additional code (including the thread termination code of attached DLLs). For more information, see Terminating a Process. A parent process can directly alter the environment variables of a child process during process creation. This is the only situation when a process can directly change the environment settings of another process. For more information, see Changing Environment Variables. If an application provides an environment block, the current directory information of the system drives is not automatically propagated to the new process. For example, there is an environment variable named =C: whose value is the current directory on drive C. An application must manually pass the current directory information to the new process. To do so, the application must explicitly create these environment variable strings, sort them alphabetically (because the system uses a sorted environment), and put them into the environment block. Typically, they will go at the front of the environment block, due to the environment block sort order. One way to obtain the current directory information for a drive X is to make the following call: GetFullPathName("X:", ...) . That avoids an application having to scan the environment block. If the full path returned is X:\, there is no need to pass that value on as environment data, since the root directory is the default current directory for drive X of a new process.When a process is created with CREATE_NEW_PROCESS_GROUP specified, an implicit call to SetConsoleCtrlHandler(NULL,TRUE) is made on behalf of the new process; this means that the new process has CTRL+C disabled. This lets shells handle CTRL+C themselves, and selectively pass that signal on to sub-processes. CTRL+BREAK is not disabled, and may be used to interrupt the process/process group. Security RemarksThe first parameter, lpApplicationName, can be NULL, in which case the executable name must be in the white space–delimited string pointed to by lpCommandLine. If the executable or path name has a space in it, there is a risk that a different executable could be run because of the way the function parses spaces. The following example is dangerous because the function will attempt to run "Program.exe", if it exists, instead of "MyApp.exe".
Copy LPTSTR szCmdline = _tcsdup(TEXT("C:\\Program Files\\MyApp -L -S")); CreateProcess(NULL, szCmdline, /* ... */);
To avoid this problem, do not pass NULL for lpApplicationName. If you do pass NULL for lpApplicationName, use quotation marks around the executable path in lpCommandLine, as shown in the example below.
Copy LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S")); CreateProcess(NULL, szCmdline, /*...*/);
ExamplesFor an example, see Creating Processes.Requirements
See also
from MSDN. ShellExecute, ShellExecuteEx - exe 파일 을 실행시키는것외에 일반파일도 인자로 전달하여 인쇄, 탐색기 열기가능. - 실행시킬 프로그램과 연결된 파일지정 가능. 예. txt 파일을 메모장으로 열기. - 내부적으로는 CreateProcess 이용함. |
|||||||||||||||
ShellExecute 상세 . from MS
1. CreateProcess 이용 외부 프로그램 실행. |
|||
기본 사용법.
인자들이 많아서 세부조절이 가능하나, 최소한의 인자를 사용하여 notepad.exe 를 실행시키기 위해서는 아래 코드면 된다.
info tip. - unicode 관련.
VS2010 에서 생성된 프로젝트는 기본 문자인코딩이 unicode 로 되어있다. (프로젝트 속성창에서 볼수있고, 변경도 가능하다) unicode로 되어있는 경우, 함수를 CreateProcess 를 호출해도 실제로 작동되는 코드는 CreateProcessW 가 호출된다. CreateProcessW 함수의 특징은 unicode 스타일의 인자 변수형으로 되어있음이다. 예로, lpCommandLine 자료형이 LPTSTR 이 아닌, LPWSTR (= WCHAR* 와 같은거임) 이다. 그럼 변수선언을 LPWSTR 로 해서 사용해도 되는데, 나중에 프로젝트 설정을 unicode 인코딩 속성을 멀티바이트 문자열로 변경하면 코드 수정해야하므로 귀찮다. 이럴때 사용하기 좋은 것이 TCHAR 자료형이다. 프로젝트의 문자열 인코딩 설정이 뭘로 되어있든 정상컴파일되고 정상동작된다. |
|||
MS 사 제공 예제 코드.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc != 2 )
{
printf("Usage: %s [cmdline]\n", argv[0]);
return;
}
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
from : 프로세스 만들기 - Win32 apps | Microsoft Docs
본 글이 포함된 상위 정리 장소. Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11 |
첫 등록 : 2016.0128
최종 수정 : 2021.09.12
단축 주소 : https://igotit.tistory.com/627
'VisualStudio.C++.C# > 코딩팁,함수활용,단편' 카테고리의 다른 글
MFC 응용프로그램 실행 인자 전달하기. (0) | 2016.01.28 |
---|---|
DLL 의 절대 경로 알아내기. GetModuleFileName (0) | 2016.01.28 |
STL Containers. vector, array, deque, list, forward_list (0) | 2016.01.20 |
Stream Data (Real Time) 송수신 개체간 연결 형식 검토. (0) | 2016.01.20 |
문자열 복사. _tcscpy_s, strcpy_s, wcscpy_s, _mbscpy_s (0) | 2016.01.18 |
댓글