2016-09-26 12 views
0

私はC++プログラムを使ってコマンドラインを起動しようとしていますが、その後cmdコマンドを実行してください。私は何が間違っているのか分かりません。私はMSDNのドキュメントを見てきましたが、私は自分のコードで何を変更するのか理解できません。CreateProcessを使ってcmdでコマンドを実行するには?

以下は、私が書いたコードです。私はcmdを起動し、cmdArgsでコマンドを実行しようとしています。しかし、プログラムの実行時には、nslookupの部分を実行せずにcmdを起動するだけです。 ipconfigのような他のコマンドも試してみましたが、実行されません。誰かが私が間違っていることを理解するのを助けることができますか?

プログラムを起動すると、cmdが表示されます。私がしようとしているのは、cmdArgsを実行し、cmdスクリーン上の出力を見ることです。

私はC++を使い慣れていないので、これが自明であれば謝ります。私はサイト上の他の質問を見てきましたが、cmdArgsの形式は正しいと思われます - プログラム名の後ろにargが続きます。

STARTUPINFO si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

LPTSTR cmdPath = _T("C:\\Windows\\System32\\cmd.exe"); 
LPTSTR cmdArgs = _T("C:\\Windows\\System32\\cmd.exe nslookup myip.opendns.com. resolver1.opendns.com"); 


if (!CreateProcess(cmdPath, cmdArgs, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 
{ 
    std::cout << "Create Process failed: " << GetLastError() << std::endl; 
    return "Failed"; 
} 
+0

CreateProcessはドキュメントで指定されているとおりに変更できるため、コマンドラインには書き込み可能な文字列を渡す必要があります。 'TCHAR cmdArgs [] = _T(" ... ");'のようなものクラッシュしている場合は、デバッガで実行してどこで、なぜそれを見つけるべきですか? –

+0

なぜこれをやりますか?なぜnslookupを実行しないのですか? –

答えて

0

あなたのプログラムは、あなたが尋ねたものとまったく同じです:cmd.exe実行可能ファイルを起動するだけです。コンソールウィンドウ内だけでテスト:

C:\Users\xxx>start /w cmd ipconfig 

C:\Users\xxx>cmd ipconfig 
Microsoft Windows [version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. Tous droits réservés. 

C:\Users\xxx>exit 

C:\Users\xxx> 

のでcmd.exe ipconfigはちょうどラインの残りを実行せずに新しいcmd.exeを押しました。その後、標準入力からのコマンドを待っています。

あなたが最初のコマンドの後に終了しCMDないしたい場合は、コマンド、またはcmd.exe /K ipconfigを実行するための新しいcmd.exeを依頼するcmd.exe /c ipconfigを使用する必要があります。

C:\Users\serge.ballesta>cmd /c ipconfig 

Configuration IP de Windows 
... 

つまり、あなたのコードで記述する必要があります:

... 
LPTSTR cmdArgs = _T("C:\\Windows\\System32\\cmd.exe /k nslookup myip.opendns.com. resolver1.opendns.com"); 
... 
+0

これをクリアしていただきありがとうございます。 – spdcbr

+3

* "あなたはあなたのコードを書くべきです:' LPTSTR cmdArgs = _T( "string literal"); '" * - それは[CreateProcess](https://msdn.microsoft.com/) en-us/library/windows/desktop/ms682425.aspx)がアクセス違反で失敗することがあります。そうでない場合は、変更可能なコピーを取ってください: 'TCHAR cmdArgs [] = _T(" string literal ");'、そのコピーの最初の要素にアドレスを渡してください。 – IInspectable

関連する問題