-1
我使用this answer中的示例代碼。有用。Pinvoke CreateProcess從文件輸入/輸出
但我需要將標準輸入/輸出重定向到文件。 進程啓動信息結構有字段:
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
我想是這樣的:
StartupInfo startupInfo = new StartupInfo();
startupInfo.cb = Marshal.SizeOf((object)startupInfo);
startupInfo.dwFlags = 128;
FileStream fs = new FileStream(filePath, FileMode.Open);
startupInfo.hStdInput = fs.Handle;
而且這是行不通的。
如何將文件作爲標準輸入/輸出傳遞?
UPD1。
我怎麼叫CreateProccess:
StartupInfo startupInfo = new StartupInfo();
startupInfo.cb = Marshal.SizeOf((object)startupInfo);
startupInfo.dwFlags = 128;
FileStream fs = new FileStream(filePath, FileMode.Open);
startupInfo.hStdInput = fs.Handle;
Pinvoke.SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
CreationFlags dwCreationFlags = CreationFlags.CREATE_BREAKAWAY_FROM_JOB | CreationFlags.CREATE_SUSPENDED | CreationFlags.CREATE_SEPARATE_WOW_VDM;
SecurityAttributes securityAttributes = new SecurityAttributes();
securityAttributes.bInheritHandle = 1;
ProcessInformation pi;
if (!Pinvoke.CreateProcess(null, configuration.RunString, ref securityAttributes, ref securityAttributes, boolInheritHandles: true, dwCreationFlags: dwCreationFlags, lpEnvironment: IntPtr.Zero, lpszCurrentDir: configuration.Directory, startupInfo: ref startupInfo, pi: out pi))
throw new Win32Exception(Marshal.GetLastWin32Error());
UPD2。 我加SetHandleInformation
通話,但它並不能幫助:根據意見
FileStream fs = new FileStream(@"C:\input.txt", FileMode.Open, FileAccess.Read);
Pinvoke.SetHandleInformation(fs.Handle, 0x00000001, 0x00000001);
startupInfo.hStdInput = fs.Handle;
文件句柄必須是*可繼承*和過程必須用* bInheritHandles == true * – RbMm
@RbMm創建感謝您的評論。我在'CreateProcess'調用和'securityAttributes'中添加了true,但它並沒有幫助 – Backs
,但是您需要在創建/打開文件句柄中使用securityAttributes - 而不是進程 – RbMm