2017-09-23 4 views
0

文字列変数を使用してプロセスを作成しようとしています。C++ create process-string cmd行パラメータのvar - 何も起こっていません

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'は' TCHAR [] 'の代わりに' WCHAR [] 'として宣言し、' CreateProcess'を 'CreateProcessW'に変更して一致させる必要があります。そして、私は固定配列の代わりに 'std :: vector'を使用します。それとも、 'cmd_line.c'を' 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); 
関連する問題