作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 MyProgram.c 中,我正在执行 CreateProcess("GetData.exe"....);。 GetData 在命令行上运行时将大约 100 行数据打印到标准输出。当我运行 MyPragrame.exe 时,我希望数据不会输出到标准输出,而是希望将其保存在缓冲区 DataBuffer[100][100] 中,假设有 100 行的 strlen 为 100。请帮忙。谢谢
我的程序.c:
#include <Windows.h>
#include <stdio.h>
void
main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
char DataBuffer[100][100];
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( !CreateProcess( NULL, // No module name (use command line)
"Getdata.exe", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
}
最佳答案
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx与您的 STARTUPINFO
参数“si”一起使用,在 dwFlags
中使用 STARTF_USESTDHANDLES
,并为 提供一个
.HANDLE
>hStdOutput
或者,更简单的方法是,您可以在命令行中重定向文件的输出。例如:GetData.exe > File.txt
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
“使用重定向输入和输出创建子进程”示例,适用于仅读取进程的标准输出,适合您的设置。
#include <comdef.h>
int main() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
char DataBuffer[100][100];
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
SECURITY_ATTRIBUTES saAttr;
// Set the bInheritHandle flag so pipe handles are inherited.
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
HANDLE g_hChildStd_IN_Rd = NULL;
HANDLE g_hChildStd_OUT_Rd = NULL;
HANDLE g_hChildStd_OUT_Wr = NULL;
// Create a pipe for the child process's STDOUT.
if (!CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0))
{
printf("StdoutRd CreatePipe");
return 0;
}
// Ensure the read handle to the pipe for STDOUT is not inherited.
if (!SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0))
{
printf("StdoutRd CreatePipe");
return 0;
}
si.cb = sizeof(STARTUPINFO);
si.hStdError = g_hChildStd_OUT_Wr;
si.hStdOutput = g_hChildStd_OUT_Wr;
si.hStdInput = g_hChildStd_IN_Rd;
si.dwFlags |= STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, // No module name (use command line)
"c:\\windows\\system32\\whoami.exe", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
TRUE, // Set handle inheritance to TRUE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
_com_error e(GetLastError());
printf("CreateProcess failed (%d - %s).\n", GetLastError(), e.ErrorMessage());
return 0;
}
DWORD bytesRead;
if (!ReadFile(g_hChildStd_OUT_Rd, DataBuffer, 100 * 100, &bytesRead, NULL))
{
_com_error e(GetLastError());
printf("ReadFile failed (%d - %s).\n", GetLastError(), e.ErrorMessage());
}
return 0;
}
现在,whoami.exe 的输出在 DataBuffer 中。请注意,此示例忽略了许多您可能想要解决的安全问题,尤其是在您不自己提供 GetData.exe 的情况下。
关于c++ - 如何将写入标准输出的数据保存到本地缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28993790/
我是一名优秀的程序员,十分优秀!