-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