2016-04-01 18 views
1
bool execute() 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    bool flag = true; 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 
    string f = "dir desktop" 
    if (CmdLine.parameter != "") 
    { 
     LPSTR l1 = const_cast<char *>(f.c_str()); 
     CreateProcess(NULL, l1, NULL, NULL, false, 0, NULL, NULL, &si, &pi); 
     flag = true; 
     // WaitForSingleObject(pi.hProcess, INFINITE); 

     // // Close process and thread handles. 
     // CloseHandle(pi.hProcess); 
     // CloseHandle(pi.hThread); 
     //} 
    } 
    return flag; 
} 

私はVisual Studioでcmdコマンドを実行しようとしています。 私はこのことを実行するためにcreateprocces(API)を使用しています しかし、何も実行されない理由を理解できません。cmdにcommendを実行しようとすると、createprocces(API)を使用してC++をスローしますか?

+0

なぜ 'flag'は2つの場所で' true'に設定され、決して 'false'に設定されませんか? –

答えて

0

最初のパラメータをNULLに設定してCreateProcess()を呼び出す場合、l1が呼び出すモジュール名で始まることを確認する必要があります。

dirはコマンドプロセッサの内部コマンドであり実行可能ファイルではないため、モジュール名にcmdを使用し、残りのパラメータにはas cmd expects themを指定する必要があります。

だから、次の操作を試してください。

string f = "cmd /c=dir desktop"; 
1

dirそれはあなたが実行可能なプログラムではありません、cmd.exeが理解するコマンドです。

cmd /k "dir desktop"というコマンドをC++文字列として正しく表示できます。

例えば、

auto execute() 
    -> bool 
{ 
    STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi = {}; 
    string f = "cmd /k \"dir desktop\"\0"; 
    bool const ok = !!CreateProcess(0, &f[0], 0, 0, false, 0, 0, 0, &si, &pi); 
    if(!ok) { return false; } 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
    return true; 
} 

ZeroMemoryへの呼び出しは、C++の初期化に置き換えられているかに注意してください。

コンパイラに任せれば、より正確で正確なコードが得られます。勝つ勝利。

免責事項:コンパイラによってコードがレビューされません。目的は、ユーザーのデスクトップフォルダの内容を一覧表示する場合


は、その後、dir desktopはそれをしないことに注意してください。コマンドインタプリタのインタラクティブコマンドとしてdir %userprofile%\desktopを使うことができ、これはWindowsの実行ダイアログでも機能します。コマンドライン引数のコマンドインタプリタの動作によっては、直接CreateProcess経由で動作するかどうかは関係ありません。 Windows APIのレベルの機能を使用する場合


は一般に、即ち<windows.h>を含む前UNICODEを定義する(または明示的に...W関数を使用)、wchar_tベースのテキストベースの機能を使用することが好ましいです。

関連する問題