如何隐藏命令窗口并显示EditBox控件中的所有潜在错误?

时间:2015-12-12 09:05:34

标签: c++ c++builder

我正在 Borland C ++ Builder 中创建简单的应用程序。

我的代码如下所示:

void __fastcall TForm1::Button3Click(TObject *Sender)
{


    system("java -jar decompile.jar -o Source/ file.jar");

}

现在我想隐藏命令窗口并显示EditBox控件中的所有潜在错误。如果没有错误,EditBox控件应保持为空。

Edit1->Text= "ERROR";

2 个答案:

答案 0 :(得分:1)

  1. 使用TMemo代替TEdit框进行记录

    它有多行和支持滚动条。这对日志来说要好得多。

  2. 请参阅how to redirect commnd promt output to file

    我不使用JAVA,但您可以尝试:

    system("java -jar decompile.jar -o Source/ file.jar > errorlog.txt");
    

    或:

    system("java -jar decompile.jar -o Source/ file.jar >> errorlog.txt");
    

    您还可以包含应用程序路径

    AnsiString exepath=ExtractFilePath(Application->ExeName);
    

    因此,您将文件保存到已知位置,而不是在运行时可以轻松更改的实际路径...

  3. 请参阅How can I run a windows batch file but hide the command window?

    因此,您需要直接将CreateProcess java.exe command.com 一起使用。我从未做过隐藏的事情,所以请按照链接 Q / A 中的答案进行操作。如果你不知道如何使用CreateProcess(这对于初学者来说可能是压倒性的)那么这就是我如何使用它(它不会隐藏只是启动一个exe ...)

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES attr0,attr1;
    
    ZeroMemory(&si,sizeof(si));
    ZeroMemory(&pi,sizeof(pi));
    si.cb=sizeof(si);
    
    attr0.nLength=sizeof(SECURITY_ATTRIBUTES);
    attr0.bInheritHandle=TRUE;
    attr0.lpSecurityDescriptor=NULL;
    attr1=attr0;
    CreateProcess(NULL,"some_app.exe > logfile.txt",&attr0,&attr1,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
    

    你可以使用:

    TerminateProcess(pi.hProcess,0);
    

    强制终止该应用....

  4. 现在,当我把所有这些放在一起时,我得到了这个:

    AnsiString s,logfile;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES attr0,attr1;
    
    ZeroMemory(&si,sizeof(si));
    ZeroMemory(&pi,sizeof(pi));
    si.cb=sizeof(si);
    // hide the process
    si.wShowWindow=SW_HIDE;
    si.dwFlags=STARTF_USESHOWWINDOW;
    
    attr0.nLength=sizeof(SECURITY_ATTRIBUTES);
    attr0.bInheritHandle=TRUE;
    attr0.lpSecurityDescriptor=NULL;
    attr1=attr0;
    
    // Application local path log filename
    logfile=ExtractFilePath(Application->ExeName)+"logfile.txt";
    DeleteFileA(logfile); // delete old log just to be sure
    // command line string to run (instead of "dir" use "java -jar decompile.jar -o Source/ file.jar")
    s="cmd /c dir > \""+logfile+"\"";
    
    CreateProcess(NULL,s.c_str(),&attr0,&attr1,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
    
    // wait for execution with some timeout...
    for (int i=0;i<100;i++)
        {
        if (FileExists(logfile)) break;
        Sleep(100);
        }
    // copy the log into TMemo mm_log ...
    if (FileExists(logfile)) mm_log->Lines->LoadFromFile(logfile); else mm_log->Text="No log file found";
    

    其中mm_log是备忘录,我复制日志文件。这个例子只是运行dir命令来显示目录信息...所以改为使用你的JAVA ...就像我在rem中建议的那样。如果您使用较旧的操作系统,则使用cmd代替command。您也可以使用FileExists来确定它是哪一个......

答案 1 :(得分:0)

您需要使用Win32 CreateProcess()函数而不是C system()函数。 CreateProcess()允许您重定向已启动流程的STDINSTDOUTSTDERR

Creating a Child Process with Redirected Input and Output

您可以使用所需的输入参数直接启动java.exe,使用CreatePipe()创建的匿名管道重定向其输出,然后使用ReadFile()从这些管道读取输出,直到进程终止。您可以根据需要解析和显示输出。

至于隐藏命令窗口,在调用CreateProcess()时,您可以:

  1. CREATE_NO_WINDOW的{​​{1}}参数中指定dwCreationFlags标记。

  2. 传递给CreateProcess() STARTUPINFO参数的lpStartupInfo结构中的
  3. ,在CreateProcess()字段中包含STARTF_USESHOWWINDOW标记,并设置STARTUPINFO::dwFlags字段STARTUPINFO::wShowWindow

  4. 尝试这样的事情:

    SW_HIDE