gpt4 book ai didi

c++ - 如何在 Windows 中不显示 cmd 窗口的情况下运行带有参数的外部程序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:02 26 4
gpt4 key购买 nike

我今天早些时候问了一个问题,因为我想运行一个从我的 C++ 代码中获取参数的可执行文件,但它无法正常工作。

它现在可以工作了,但我仍然遇到问题,因为我认为我正在以正确的方式解决这个问题,但似乎我想要完成的事情无法按照我接近的方式完成......

这是我从其他问题中更正的代码:

#include <stdlib.h>
#include <conio.h>

int main (){
system("\"\"C:\\Users\\Adam\\Desktop\\pdftotext\" -layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"\"");
_getch();
}

我正在运行“pdftotext -layout myfile.pdf”,就好像我是从 CMD 窗口运行它一样。

问题是,我实际上不希望 cmd 出现,因为我在它上面有一个 GUI 界面,我想显示一个更好的进度条,而不是看到我需要的每个文件的窗口弹出窗口解析。

我环顾四周,要么我不明白我在读什么,因为我是 C++ 的新手,要么我只是没有找到我要找的东西。我发现使用 CreateProcess,我应该能够做到这一点,但是在复制了一些我在其他地方找到的代码之后,cmd 窗口仍然弹出。

如果有人可以给我一个函数的名称,我可以用它来完成这样的事情,或者如果有人可以在我发布的代码中为这个小案例提供一些示例代码,我会很高兴,因为我不确定我作为 C++ 的新手,我应该理解一切。

编辑:根据评论中的要求,我尝试的 CreateProcess 代码是我在这个网址上找到的:

http://www.goffconcepts.com/techarticles/development/cpp/createprocess.html

这是(我认为应该放在那里的我自己的参数):

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

size_t ExecuteProcess(std::wstring FullPathToExe, std::wstring Parameters, size_t SecondsToWait)
{
size_t iMyCounter = 0, iReturnVal = 0, iPos = 0;
DWORD dwExitCode = 0;
std::wstring sTempStr = L"";

/* - NOTE - You should check here to see if the exe even exists */

/* Add a space to the beginning of the Parameters */
if (Parameters.size() != 0)
{
if (Parameters[0] != L' ')
{
Parameters.insert(0,L" ");
}
}

/* The first parameter needs to be the exe itself */
sTempStr = FullPathToExe;
iPos = sTempStr.find_last_of(L"\\");
sTempStr.erase(0, iPos +1);
Parameters = sTempStr.append(Parameters);

/* CreateProcessW can modify Parameters thus we allocate needed memory */
wchar_t * pwszParam = new wchar_t[Parameters.size() + 1];
if (pwszParam == 0)
{
return 1;
}
const wchar_t* pchrTemp = Parameters.c_str();
wcscpy_s(pwszParam, Parameters.size() + 1, pchrTemp);

/* CreateProcess API initialization */
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
pwszParam, 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo) != false)
{
/* Watch the process. */
dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
}
else
{
/* CreateProcess failed */
iReturnVal = GetLastError();
}

/* Free memory */
delete[]pwszParam;
pwszParam = 0;

/* Release handles */
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);

return iReturnVal;
}

int main(void){
ExecuteProcess(L"C:\\Users\\Adam\\Desktop\\pdftotext", L"-layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"", 0);
_getch();
}

我有点不知所措,因为它使用了一些我以前从未使用过的东西,但我想我理解了核心(关键字:think)。但是,它并没有解决我的问题,因为 cmd 出现了,通过重新测试我实际上注意到 cmd 甚至没有运行 .exe,也没有给我错误消息。

我希望这段代码能有所帮助...我不想进一步研究它,因为看起来我什至没有朝着正确的方向前进。

最佳答案

使用CreateProcess而不是系统。

--编辑--

the code for CreateProcess that I tried is what I found at this url:

代码很乱,我建议以后避免使用该 url。

在“CreateProcess”文章的末尾有一个名为“Creating Processes"”的链接,其中包含更简单的示例,更易于阅读。将其用作起点。

关于c++ - 如何在 Windows 中不显示 cmd 窗口的情况下运行带有参数的外部程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9970241/

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