我正在 Borland C ++ Builder 中创建简单的应用程序。
我的代码如下所示:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
system("java -jar decompile.jar -o Source/ file.jar");
}
现在我想隐藏命令窗口并显示EditBox
控件中的所有潜在错误。如果没有错误,EditBox
控件应保持为空。
Edit1->Text= "ERROR";
答案 0 :(得分:1)
使用TMemo
代替TEdit
框进行记录
它有多行和支持滚动条。这对日志来说要好得多。
请参阅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);
因此,您将文件保存到已知位置,而不是在运行时可以轻松更改的实际路径...
请参阅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);
强制终止该应用....
现在,当我把所有这些放在一起时,我得到了这个:
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()
允许您重定向已启动流程的STDIN
,STDOUT
和STDERR
。
Creating a Child Process with Redirected Input and Output
您可以使用所需的输入参数直接启动java.exe
,使用CreatePipe()
创建的匿名管道重定向其输出,然后使用ReadFile()
从这些管道读取输出,直到进程终止。您可以根据需要解析和显示输出。
至于隐藏命令窗口,在调用CreateProcess()
时,您可以:
在CREATE_NO_WINDOW
的{{1}}参数中指定dwCreationFlags
标记。
CreateProcess()
STARTUPINFO
参数的lpStartupInfo
结构中的,在CreateProcess()
字段中包含STARTF_USESHOWWINDOW
标记,并设置STARTUPINFO::dwFlags
字段STARTUPINFO::wShowWindow
。
尝试这样的事情:
SW_HIDE