2014-10-24 2 views
0

gui를 구성하기 위해 Windows Forms 응용 프로그램을 사용하는 코드를 만들었습니다. 외부 exe 호출하려면 내 코드에서 시스템 명령을 사용하고 있습니다. 그러나이 방법은 명령 행 터미널을 작성합니다. 나는 시스템을 CreateProcess 함수 here으로 대체 할 수 있음을 발견했다. 이 기능을 어떻게 사용해야합니까? 실행하려면 어떤 매개 변수를 지정해야합니까? 내 코드는 지금 :시스템 대신 CreateProcess 함수

string run_template = "a.exe -i " + s1 + " -r 10 -f image2 filename%03d.jpg"; 
system(run_template.c_str()); 

편집 :

#include <tchar.h> 

string workPath = ""; 
string args = "-i " + s1 + " -r 10 -f image2 vid/frames/filename%03d.jpg"; 

HINSTANCE hRet = ShellExecute(NULL, _T("open"), _T("a.exe"), _T(args.c_str()), _T(workPath.c_str()), SW_HIDE); 
DWORD errNum = GetLastError(); 

나는 다음과 같은 오류가있어 :

1>c\projects\first_api\first_api\Form1.h(229): error C2065: 'Largs' : undeclared identifier 
1>c:\projects\first_api\first_api\Form1.h(229): error C2228: left of '.c_str' must have class/struct/union 
1>   type is ''unknown-type'' 
1>c:\projects\first_api\first_api\Form1.h(229): error C2065: 'LworkPath' : undeclared identifier 
1>c:\projects\first_api\first_api\Form1.h(229): error C2228: left of '.c_str' must have class/struct/union 

EDIT2 :

string run_template = "a.exe -i " + s1 + " -r 1 -f image2 /filename%03d.jpg"; 
//system(run_template.c_str()); 

STARTUPINFOA si = {sizeof(STARTUPINFOA), 0}; 
PROCESS_INFORMATION pi = {0}; 

if (CreateProcessA(NULL, const_cast<char*>(run_template.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { 
    CloseHandle(pi.hThread); 
    CloseHandle(pi.hProcess); 
} 

명령 프롬프트가 계속 사용 위의 코드.

+4

제공하는 링크는 이전 Windows Mobile 6.5 버전입니다. 이것은 전체 Windows 버전과 동일해야하지만 [올바른 버전의 링크를 먼저 사용] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v)를 원할 수 있습니다. = vs.85 % 29.aspx). 그런 링크에는 [전체 예제 링크] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx)가 포함되어 있습니다. –

+0

'CreateProcess' 또는'ShellExecute'를 사용하여 얻은 컴파일 오류에 대해 묻고 있습니까? 그 두 가지는 다른 것입니다! 이 질문은 (CreateProcess를 사용하고 그 시도를 추가 한 후에) 유지할 수 있으며,'ShellExecute' 사용에 관해 새로운 질문을 할 수 있습니다. –

+0

그래, 내가 Vembu 대답 Aravind로 인해 질문을 변경했습니다. 기본적으로 커맨드 라인을 숨기려면 시스템을 교체하고 싶습니다. –

답변

5
string run_template = "a.exe -i " + s1 + " -r 10 -f image2 filename%03d.jpg"; 

STARTUPINFOA si = {sizeof(STARTUPINFOA), 0}; 
si.dwFlags = STARTF_USESHOWWINDOW; 
si.wShowWindow = SW_HIDE; 

PROCESS_INFORMATION pi = {0}; 

vector<char> cmdline(run_template.begin(), run_template.end()); 
if (CreateProcessA(NULL, &cmdline[0], NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) 
{ 
    CloseHandle(pi.hThread); 
    CloseHandle(pi.hProcess); 
} 
+0

다음 오류가 발생합니다 : 오류 C2664 : 'CreateProcessA': 'const char *'에서 'LPSTR'로 매개 변수 2를 변환 할 수 없습니다. –

+0

두 번째 매개 변수는'const'로 선언되지 않지만'c_str 입니다. 당신은 그것을 버려야 할 것입니다. –

+0

죄송합니다. 이해하기 위해 노력하고 있지만 더 큰 혼란이 일어나고 있습니다. 나는 이제 귀하의 솔루션을 시도했다 'STARTUPINFO *'에서 'LPSTARTUPINFOA'로 매개 변수 9를 변환 할 수 없습니다 –

-5

ShellExecute 함수를 대신 사용할 수 있습니다. 매우 이해하기 쉽습니다.

예 :

string workPath = "D:\\MyWorkPath\"; 
string args = "-i " + s1 + " -r 10 -f image2 filename%03d.jpg 

LPCTSTR lArgs = args.c_str(); 
LPCTSTR lPath = workPath.c_str(); 
HINSTANCE hRet = ShellExecute(NULL, _T("open"), _T("a.exe"), lArgs, lPath, SW_HIDE); 

에서 ShellExecute 함수의 마지막 인수는 콘솔 창을 숨 깁니다.

참고 : 실행중인 (a.exe) 응용 프로그램이 차단되어 있지 않아야합니다. 즉, 입력을 기다리지 않습니다. 또는 단순히 a.exe 응용 프로그램에서 cin/scanf를 사용하지 않는 것입니다.

희망이 도움이됩니다.

+0

'_T'가 표시됩니다 : 식별자를 찾을 수 없습니다. –

+1

_T는 문자열 "문자 집합 중립"을 만드는 매크로입니다. 이 문제를 해결하려면 "tchar.h"파일을 포함하십시오. –

+0

네, 맞습니다. 이미 확인해 봤습니다. 매크로 L에 다른 문제가 있습니다. –