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

How do you run external programs with parameters without the cmd window showing up in Windows?

本文关键字:运行 情况下 行带 参数 程序 外部 窗口 cmd Windows 显示      更新时间:2023-10-16

今天早些时候我刚问了一个问题,因为我想运行一个从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路径\文件");唯一的问题是文件或目录不能有空间。

相关文章: