如何在Windows中不显示cmd窗口的情况下运行带参数的外部程序
How do you run external programs with parameters without the cmd window showing up in Windows?
今天早些时候我刚问了一个问题,因为我想运行一个从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代码就是我在这个url中发现的:
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而不是系统。
--编辑--
我尝试的CreateProcess的代码就是我在这个网址上找到的:
代码一团糟,我建议以后不要使用那个url。
在"CreateProcess"文章的末尾是一个名为"CreateProcesses"的链接,其中包含更简单的示例,更易于阅读。把它作为一个起点。
在为siStartupInfo添加以下行之后,cmd窗口将不会再弹出我自己的test*.exe.
siStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
siStartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
siStartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
siStartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
siStartupInfo.wShowWindow = SW_HIDE;
但我还有一个问题。当我尝试运行其他可执行文件时,其命令行将是
TEST.exe <input-file> output-file
在cmd窗口中,WaitForSingleObject()返回258,GetLastError()返回1813("在映像文件中找不到指定的资源类型。")。有关更多详细信息,请参见system()和CreateProcess()/CreateProcessW()。
任何想法都将不胜感激!
我发现如何执行外部程序的唯一方法是:系统("启动C:\file路径\文件");唯一的问题是文件或目录不能有空间。
- 这个c++代码是如何在没有定义函数的情况下运行的
- 您可以在没有线程的情况下同时运行多个 ISR 吗?
- 如何在不丢失输出的情况下杀死/停止终端中正在运行的进程?
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- 如果程序在没有 sudo 的情况下运行,gtk_init会导致 ubuntu 16.04 崩溃
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 如何在不闪烁的情况下运行ESP32的单元测试
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 如何在不受其他文件影响的情况下"by itself" Visual Studio 项目中运行C++文件?
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- Qt qml - 在没有任何条件的情况下运行一行(while(true))
- 在给定相同的输入的情况下,某些代码怎么可能花费更多时间来运行,这似乎只是因为它处于循环中?
- 函数如何在不这样做的情况下在新线程上运行"as if"?
- 默认情况下,C++ 开关运行时循环
- while 循环是否在设置标志的情况下运行多次?
- 为什么 free 函数不能在 C 数组上运行,而 std::begin 在某些情况下可以在 C++14 中运行?
- 如果在不需要的情况下运行语句
- 在不使用容器或字符串库的情况下,在运行时增加动态数组大小
- VS Code - 如何在不再次构建的情况下运行未更改的 c++ 文件
- 如何在不将其连接到终端的情况下运行'screen',以便我可以在C++ (qt) 应用程序中捕获输出?