2017-09-23 1 views
0

그래서 문자열 변수를 사용하여 프로세스를 만들려고합니다.C++ createprocess - cmd 행 매개 변수에 대한 문자열 변수 - 아무 일도 일어나지 않습니다.

STARTUPINFO si; 
PROCESS_INFORMATION pi; 
ZeroMemory(&si, sizeof(si)); 
ZeroMemory(&pi, sizeof(pi)); 

si.cb = sizeof(si); 

std::string cmd_line = game_path + " " + std::string(game_params); 

std::cout << cmd_line << "\n"; 

if (!CreateProcess(NULL, LPTSTR(cmd_line.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { 
    std::cout << "fail\n"; 
    return false; 
} 

cout과의 cmd_line의 출력이 올바른 경로와 매개 변수 :

C:\\Program Files (x86)\\My_Game\\Game.exe -test -admin 

CreateProcess를 호출이 false를 반환하지만, 나는 이유를 정확히 모르겠어요. 나는 이것에 아주 새롭다 그래서 어떤 도움 및 통보든지 중대 할.

+1

[오른쪽 말의 입에서 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (V = VS.85)에서 .aspx) : "기능의 경우 실패하면 반환 값은 0입니다. 확장 오류 정보를 얻으려면 GetLastError를 호출하십시오. " 조언을 따르고 그 확장 된 정보를 얻는 것이 좋습니다. 관련성이있을 수 있습니다. – user4581301

+0

고마워요. 여기에 코드를 사용하고 있습니다 : https://msdn.microsoft.com/en-us/library/windows/desktop/ms680582(v=vs.85).aspx 오류 코드 2 - 파일이 나타납니다. 존재하지 않습니다. 주소 표시 줄 등에서 직접 경로를 복사하고 있습니다. 뭔가 빠져 있지 않는 한 올바른 경로가 필요합니다. – user3238415

답변

2
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    ZeroMemory(&si, sizeof(si)); 
    ZeroMemory(&pi, sizeof(pi)); 

    si.cb = sizeof(si); 

    std::string game_path = "C:\\Windows\\system32\\calc.exe"; 
    std::string game_params = "-test -admin"; 

    std::string cmd_line = game_path + " " + std::string(game_params); 

    std::cout<<cmd_line << "\n"; 

    TCHAR tszCmdLine[1024] = {0}; 
    mbstowcs(tszCmdLine, cmd_line.c_str(), 1024); 
    _tprintf(tszCmdLine); 

    if (!CreateProcess(NULL, tszCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { 
     std::cout<<"fail\n"<<GetLastError(); 
     return false; 
    } 
} 

const char*CreateProcess() 일 수 없습니다. char* 문자열을 tchar* 문자열로 작성해야합니다. mbstowcs()

+0

대단히 감사합니다. 나는'LPTSTR (cmd_line.c_str())'이 필요한 변환을 수행하고 있다고 교훈했다. – user3238415

+1

코드가 유니 코드로 변환되기 때문에'tszCmdLine'은'TCHAR []'대신'WCHAR []'로 선언되어야하고'CreateProcess'는'CreateProcessW'로 변경되어 일치해야합니다. 그리고 고정 배열 대신에'std :: vector'를 사용할 것입니다. 아니면'cmd_line'을'std :: wstring'으로 변경하고'cmd_line.c_str()'대신'cmd_line [0]'을 사용하여'CreateProcessW'로 넘겨 주면됩니다. –

+0

'MultiByteToWideChar()'를 사용하는 것이 더 mbstowcs()라고 생각합니다. – Kaizen

1

코드를 테스트했습니다.

GetLastError()의 결과는 TCHAR* 문자열로 char* 문자열을 변환하는 데 사용 MultiByteToWideCharThe system cannot find the file specified.

2.

입니다.

MultiByteToWideChar(LC_ALL, 0, cmd_line.c_str(), -1, str_command, MAX_PATH); 
관련 문제