gpt4 book ai didi

c++ - 如何将写入标准输出的数据保存到本地缓冲区

转载 作者:行者123 更新时间:2023-11-28 06:23:14 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com