如何使用win32 API将stdin重定向到C中的文件?
我试图将stdin重定向到我选择的一个文件中,在一个C程序(win32 API)中,这样就可以重定向stderr或stdout 我正在编写一个在cygwin上运行的shell,理想的效果是使用cat如何使用win32 API将stdin重定向到C中的文件?,c,winapi,io-redirection,C,Winapi,Io Redirection,我试图将stdin重定向到我选择的一个文件中,在一个C程序(win32 API)中,这样就可以重定向stderr或stdout 我正在编写一个在cygwin上运行的shell,理想的效果是使用cat
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);
}
这个stdin重定向不起作用,我做错了什么
谢谢大家! 您就快到了:)使用:
::SetHandleInformation(在HANDLE中,HANDLE\u FLAG\u INHERIT,HANDLE\u FLAG\u INHERIT)代码>再次检查代码,我编辑了它,添加了您所说的内容,我要么不理解您所说的内容,要么我做了其他错误的事情嗯,我只是在第一次评论中说它不起作用。我还在创建过程后关闭句柄,所以这不是问题所在,所以在我的建议的顶部,在CreateFile的第四个参数处打开文件w/NULL security属性)createinputHandle()的ret值是多少?你确定这是一个有效的手柄吗?让我们