2016-08-09 8 views
0

コンソールウィンドウにシンボルを書くか、を入力してと入力する必要があります。私はいくつかの変更とthis answer からのコードを使用しています:CreateProcessによって開始されたcmd.exeにシンボルまたは 'Enter'を送信する方法

procedure Console_Std_Input_Test; 
var 
    sa: TSecurityAttributes; 
    si: TStartupInfo; 
    pi: TProcessInformation; 
    BytesWritten: LongWord; 
    hInRead, hInWrite: THandle; 
begin 
    // Initialize security information 
    sa.nLength := SizeOf(sa); 
    sa.lpSecurityDescriptor := nil; 
    sa.bInheritHandle := True; 
    CreatePipe(hInRead, hInWrite, @sa, 0); 
    // Initialize startup info 
    ZeroMemory(@si, SizeOf(si)); 
    si.cb := SizeOf(si); 
    si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
    si.wShowWindow := SW_SHOWNORMAL; 
    si.hStdInput := hInRead; 
    si.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE); 
    si.hStdError := GetStdHandle(STD_ERROR_HANDLE); 
    // Start process 
    ZeroMemory(@pi, SizeOf(pi)); 
    CreateProcess(nil, 'cmd /k ', nil, nil, True, 
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi); 
    CloseHandle(pi.hThread); 
    CloseHandle(hInRead); 
    // Write '<enter>' 
    WriteFile(hInWrite, #13#10, 2, BytesWritten, nil);// nothing happens!! 
    //WriteFile(hInWrite, #48#49#50, 3, BytesWritten, nil);//write "012"-nothing appears too! 
    CloseHandle(hInWrite); 
    // Wait for process to exit 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
end; 

私はこの問題を解決しようとするすべての一日を過ごしてきたが、私はコンソールにや一部の記号を入力し送信する方法を理解することはできません。私はMSDNとMicrosoft Supportのサンプルを見てきましたが、上のコードと異なるものは見つけられず、実際に私の誤りがどこにあるのか分かりません。

+0

私は 'pause'のようなより単純なコマンドで動作するかどうか試してみます。 –

+0

@ Jean-FrançoisFabre、はい、CreateProcess(nil、 'cmd/k pause' ...)を作成しましたが、何も起こりません。コンソールが入力キーを待っています – George

+0

私はちょうど 'ポーズ'を意味します。まあ、それは同じことをすると思います。あまりにも#13#10シーケンスをいくつか追加してみてください。 –

答えて

0

@Remuルボーはコメントでの質問に答えた:特に

を、あなたは(のCreateProcessを呼び出す前にhInWriteからHANDLE_FLAG_INHERITを削除されていません)

私のミスだったこと。

関連する問題