CreateProcess调用cmd.exe incl。没有显示(闪烁)窗口的参数?

时间:2017-10-04 19:23:25

标签: c++ cmd createprocess windows-console

传奇继续......

我在网上搜索过,我已经在StackOverflow上搜索过,我发现很多希望给出答案/解决方案,但不知何故他们都失败了(包括与ShellExecute相关的那些(Ex) ))。

如何使用CreateProcess隐藏(闪烁)CMD窗口(包括参数)

我基本上想要调用/执行一组条件/本机cmd.exe命令(即FOR /F||),还要调用/执行外部命令FIND(STR).exe。而且,没有显示(闪烁)CMD窗口。

但即使隐藏像"cmd.exe /C ECHO ...flashing window is bad..."这样简单的事情似乎也无法做到。

我尝试过的代码(包括与dwFlagswShowWindow标记相关的许多变体

#include <windows.h>

int main()


{

    char cmdline[] = "cmd.exe /c ECHO ...flashing window is bad...";

    PROCESS_INFORMATION pi;
    STARTUPINFO si;

//  memset(&si,0,sizeof(STARTUPINFO));
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);

//  si.dwFlags = STARTF_USESTDHANDLES;
//  si.dwFlags = CREATE_NO_WINDOW;
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
//  si.wShowWindow = CREATE_NO_WINDOW;

    CreateProcess(NULL, (LPSTR) cmdline, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);

    WaitForSingleObject(pi.hProcess, INFINITE);

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

//  ExitProcess;

    return 0;

}

我不想依赖外部程序,即.vbs(Windows Scripting Host)或快捷方式,但只是一个独立的编译.exe。

这是(真的)要求太多,还是我(完全)错了?

感谢...

2 个答案:

答案 0 :(得分:1)

更新:您似乎也将CreateProcess标志(其dwCreationFlags参数)与STARTUPINFO结构的成员混淆。这些是不同的标记,CREATE_NO_WINDOW不应位于STARTUPINFO

您必须传递CREATE_NO_WINDOW标志,然后控制台窗口才会显示。最初我回答说你必须重新定位不正确的标准手柄(但仍然强烈推荐)。

设置STARTF_USESTDHANDLES并填写适当的句柄。如果您对流程的输出感兴趣,请创建管道,否则您只需打开nul通道即可。

答案 1 :(得分:0)

尝试使用ProcessBuilder。这是一个我有一些代码似乎工作得很好的代码示例。在下面的代码中,shellScript是我动态创建的StringBuilder,它包含我想要执行的命令及其参数。

String[] scriptArray = shellScript.toString().split(" ");

ProcessBuilder builder = new ProcessBuilder(scriptArray);
File outputFile = new File("/logs/AgentOutputLog.txt");
File errorFile = new File("/logs/AgentErrorLog.txt");
builder.redirectOutput(outputFile);
builder.redirectError(errorFile);
Process process = builder.start();
int errCode = process.waitFor();

//errCode = 0 means online
if(errCode == 0){
    success = true;
    break;
//errCode = 1 means offline
} else if (errCode == 1){
    success = false;
    break;
}