117.info
人生若只如初见

CreateProcess和CreatePipe在VC ++中执行进程并以字符串形式返回输出

以下是在VC ++中使用CreateProcess和CreatePipe执行进程并以字符串形式返回输出的示例代码:

#include 
#include 
#include 
std::string ExecuteCommand(const std::string& cmd)
{
SECURITY_ATTRIBUTES securityAttributes;
securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
securityAttributes.bInheritHandle = TRUE;
securityAttributes.lpSecurityDescriptor = NULL;
HANDLE StdOutRead, StdOutWrite;
CreatePipe(&StdOutRead, &StdOutWrite, &securityAttributes, 0);
SetHandleInformation(StdOutRead, HANDLE_FLAG_INHERIT, 0);
STARTUPINFOA startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.hStdOutput = StdOutWrite;
startupInfo.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(processInfo));
if (!CreateProcessA(NULL, const_cast(cmd.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &startupInfo, &processInfo))
{
std::cerr << "Failed to execute command: " << cmd << std::endl;
return "";
}
CloseHandle(StdOutWrite);
DWORD bytesRead;
const int bufferSize = 4096;
char buffer[bufferSize];
std::string output;
while (ReadFile(StdOutRead, buffer, bufferSize - 1, &bytesRead, NULL))
{
if (bytesRead == 0)
break;
buffer[bytesRead] = '\0';
output += buffer;
}
CloseHandle(StdOutRead);
WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return output;
}
int main()
{
std::string cmd = "dir";
std::string output = ExecuteCommand(cmd);
std::cout << "Command output: " << std::endl;
std::cout << output << std::endl;
return 0;
}

上述代码使用CreatePipe创建了一个匿名管道,将进程的输出重定向到管道的写入端,然后使用ReadFile从管道的读取端读取输出。最后,使用CreateProcess启动进程并等待其完成。

在上述示例中,cmd变量包含要执行的命令,该命令是一个简单的"dir"命令,它会列出当前目录中的文件和文件夹。您可以根据需要更改cmd变量以执行其他命令。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe7afAzsLBAFUAlw.html

推荐文章

  • c#中datagridview控件怎么使用

    在C#中,可以通过以下步骤来使用DataGridView控件: 在窗体上拖放一个DataGridView控件,或者在代码中动态创建一个DataGridView对象。 设置DataGridView的属性。...

  • c++获取命令行参数失败怎么解决

    C++获取命令行参数失败的原因可能有很多种,下面列举几种常见的解决方案: 检查代码:确保你的代码正确获取命令行参数。你可以使用argc和argv参数来获取命令行参...

  • C#手机号换成111XXXX1111这种显示解决思路

    要将手机号中的中间几位数字替换为"XXXX",可以使用字符串的Substring方法来截取手机号的前三位和后四位,然后再用字符串的Replace方法将中间的数字替换为"XXXX"...

  • C#多线程使用Parallel.ForEach并行循环,真的能提高效能

    是的,使用Parallel.ForEach可以提高程序的执行效率。Parallel.ForEach方法可以将一个集合分成多个小块,并使用多个线程并行处理这些小块,从而加速程序的执行。...

  • 在数组中的参数时调用Method.invoke()

    在使用反射调用方法时,可以通过Method类的invoke()方法来实现。invoke()方法用于调用指定方法,并传入对应的参数。
    假设有一个名为method的Method对象,可...

  • 在Javascript中获取ExternalInterface定义

    在JavaScript中,无法直接获取ExternalInterface的定义。ExternalInterface是一个ActionScript(Flash)中的接口,用于与JavaScript进行通信。它允许Flash应用程...

  • PropertyChangedEventHandler 不会异步触发

    PropertyChangedEventHandler 是一个事件处理程序委托,用于处理属性值发生变化的事件。根据.NET框架的规定,事件处理程序委托默认是同步触发的,即在属性值发生...

  • Vb Convert.ToInt32 语法

    Convert.ToInt32()是一个用于将其他数据类型转换为整数类型的方法。它的语法如下:
    Convert.ToInt32(value)
    其中,value是要转换的值,可以是任何数据...