gpt4 book ai didi

c++ - 有什么方法可以阻止 _popen 打开 DOS 窗口吗?

转载 作者:可可西里 更新时间:2023-11-01 12:50:16 24 4
gpt4 key购买 nike

我正在使用 _popen 启动一个进程来运行命令并收集输出

这是我的 C++ 代码:

bool exec(string &cmd, string &result)
{
result = "";

FILE* pipe = _popen(cmd.c_str(), "rt");
if (!pipe)
return(false);

char buffer[128];
while(!feof(pipe))
{
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
_pclose(pipe);
return(true);
}

有没有办法在不打开控制台窗口的情况下执行此操作(就像目前在 _popen 语句中所做的那样)?

最佳答案

在 Windows 上,具有 STARTUPINFO 结构的 CreateProcess 具有包含 STARTF_USESSHOWWINDOW 的 dwFlags。然后将 STARTUPINFO.dwFlags 设置为 SW_HIDE 将导致控制台窗口在触发时隐藏。示例代码(可能格式不正确,并且包含 C++ 和 WinAPI 的混合):

#include <windows.h>
#include <iostream>
#include <string>

using std::cout;
using std::endl;

void printError(DWORD);

int main()
{
STARTUPINFOA si = {0};
PROCESS_INFORMATION pi = { 0 };

si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
BOOL result = ::CreateProcessA("c:/windows/system32/notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if(result == 0) {
DWORD error = ::GetLastError();
printError(error);
std::string dummy;
std::getline(std::cin, dummy);
return error;
}

LPDWORD retval = new DWORD[1];
::GetExitCodeProcess(pi.hProcess, retval);
cout << "Retval: " << retval[0] << endl;
delete[] retval;

cout << "Press enter to continue..." << endl;
std::string dummy;
std::getline(std::cin, dummy);

return 0;
}

void printError(DWORD error) {
LPTSTR lpMsgBuf = nullptr;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
cout << reinterpret_cast<char*>(lpMsgBuf) << endl;
LocalFree(lpMsgBuf);
}

关于c++ - 有什么方法可以阻止 _popen 打开 DOS 窗口吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020653/

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