2013-03-30 63 views
2

我正在嘗試將stdin重定向到我選擇的文件中,在C程序(win32 API)中留下重定向stderr或stdout的可能性。如何使用win32 API將stdin重定向到C文件?

我正在寫一個我在cygwin上運行的shell,期望的效果是讓貓<文件 工作。

這是我到目前爲止的代碼:

static HANDLE createinputHandle(PCSTR filename, SECURITY_ATTRIBUTES sa) 
    { 
      return CreateFile(
       filename, 
       GENERIC_READ, 
       FILE_SHARE_READ, 
       NULL, 
       OPEN_ALWAYS, 
       FILE_ATTRIBUTE_NORMAL, 
       NULL); 
    } 


    static VOID RedirectHandle(STARTUPINFO *psi, HANDLE hFile, INT opt) 
    { 
     if (hFile == INVALID_HANDLE_VALUE) 
      return; 

     psi->dwFlags |= STARTF_USESTDHANDLES; 

     switch (opt) { 
     case STD_INPUT_HANDLE: 
      psi->hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
      psi->hStdInput = hFile; 
      break; 
     case STD_OUTPUT_HANDLE: 
      psi->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
      psi->hStdOutput = hFile; 
      break; 
     case STD_ERROR_HANDLE: 
      psi->hStdError = GetStdHandle(STD_ERROR_HANDLE); 
      psi->hStdError = hFile; 
      break; 
     } 

command_func() { 
STARTUPINFO si; 
PROCESS_INFORMATION pi; 
bool result; 
DWORD wait_result; 
HANDLE inHandle, outHandle, errHandle; 
SECURITY_ATTRIBUTES sa; 

ZeroMemory(&si, sizeof(si)); //macro to init with zero's 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 
ZeroMemory(&sa, sizeof(sa)); 
sa.bInheritHandle = TRUE; 

inHandle = INVALID_HANDLE_VALUE; 
outHandle = INVALID_HANDLE_VALUE; 
errHandle = INVALID_HANDLE_VALUE; 

    if(inputFile != NULL) { 

     inHandle = createinputHandle(inputFile, sa); 
      SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); 
      //added 
     RedirectHandle(&si, inHandle, STD_INPUT_HANDLE); 

    } 


result = CreateProcess(
      NULL, 
      cmd, /*if you want to test this, you need to change cmd to something like "ls -l" */ 
      NULL, 
      NULL, 
      TRUE, 
      0, 
      NULL, 
      NULL, 
      &si, 
      &pi); 
} 

這個標準輸入重定向不工作,我究竟做錯了什麼?

謝謝!

回答

2

你幾乎沒有:)使用:::SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);

+0

再次檢查代碼,我編輯它加入你說什麼,我要麼不明白你在說什麼,或者我在做別的事情不對 – pAndrei

+0

是的,請給它一個嘗試 –

+0

呃,我剛剛在我的第一個評論中說,它不起作用。我也在創建過程後關閉句柄,所以這不是問題 – pAndrei

相關問題