2017-09-23 56 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):「如果函數失敗,返回值爲零。要獲得擴展的錯誤信息,請調用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

由於代碼轉換爲Unicode,因此'tszCmdLine'應該聲明爲'WCHAR []'而不是'TCHAR []',並且'CreateProcess'應該改爲'CreateProcessW'來匹配。我會使用一個'std :: vector'而不是一個固定的數組。或者,更好的方法是將'cmd_line'改爲'std :: wstring',並使用'&cmd_line [0]'而不是'cmd_line.c_str()'將它傳遞給'CreateProcessW'。 –

+0

我認爲使用'MultiByteToWideChar()'比mbstowcs()更好' – Kaizen

1

我測試了你的代碼。

GetLastError()結果是2

也就是說The system cannot find the file specified.

使用MultiByteToWideCharchar*字符串轉換爲TCHAR*字符串。

MultiByteToWideChar(LC_ALL, 0, cmd_line.c_str(), -1, str_command, MAX_PATH); 
相關問題