Показать полную графическую версию : bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы
crashtuak
06-05-2009, 07:55
Есть у нас пакетный файл. Надо его сокрыть и выводить все данные с него, например, в ТекстБокс в нашей программе. Ну и если в нашем цмд есть моменты, где надо вводить данные, то сделать поле на форме, с которого те данные будут ити в консоль.
http://www.delphisources.ru/pages/faq/base/console_to_memo.html - пример на делфи но думаю суть будет понятна - я могу транслировать на c++ borland если не разберешься
Транслировал, но что-то не работает что понять не могу (возможно BDS 2006) - выдает ошибку при нажатие на кнопку - ошибка доступа к kernel32.dll (обычное исключение рунтайма). Стопится все на этой строчке if (CreatePipe(ReadPipe,WritePipe,&Security,0)) .
Весь исходник :
//$$---- Form CPP ----
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "uwincon.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
void RunDosInMemo(char* cmd, TMemo* memo)
{
const ReadBuffer = 2400;
SECURITY_ATTRIBUTES Security;
PHANDLE ReadPipe, WritePipe;
STARTUPINFO start;
PROCESS_INFORMATION ProcessInfo;
char Buffer[ReadBuffer];
DWord BytesRead;
//========================
Security.nLength= sizeof(SECURITY_ATTRIBUTES);
Security.bInheritHandle=TRUE;
Security.lpSecurityDescriptor=NULL;
if (CreatePipe(ReadPipe,WritePipe,&Security,0)) { //тут ошибка как будто не туда ссылка идет в kernel. При чем в делфях того же BDS все ок
ZeroMemory( &start, sizeof(start) );
start.cb = sizeof(start);
start.hStdOutput = WritePipe;
start.hStdInput = ReadPipe;
start.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow = SW_HIDE;
if (CreateProcess(NULL,cmd, &Security, &Security, true,
NORMAL_PRIORITY_CLASS,NULL,NULL,&start, &ProcessInfo))
do
{
ReadFile(ReadPipe, Buffer, ReadBuffer, &BytesRead, NULL);
Buffer[BytesRead]= 0;
OemToAnsi(Buffer, Buffer);
memo->Text = memo->Text + Buffer;
Application->ProcessMessages();
}
while (WaitForSingleObject(ProcessInfo.hProcess, 100) == WAIT_TIMEOUT) ;
//FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
}
}
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Memo1->Clear();
RunDosInMemo("ping -t 192.168.0.3", Memo1);
}
//---------------------------------------------------------------------------
Все разобрался:
void RunDosInMemo(char* cmd, TMemo* memo)
{
const ReadBuffer = 2400;
SECURITY_ATTRIBUTES Security;
HANDLE ReadPipe, WritePipe;
STARTUPINFO start;
PROCESS_INFORMATION ProcessInfo;
char Buffer[ReadBuffer];
DWord BytesRead, Apprunning;
//========================
Security.nLength= sizeof(SECURITY_ATTRIBUTES);
Security.bInheritHandle=TRUE;
Security.lpSecurityDescriptor=NULL;
if (CreatePipe(&ReadPipe,&WritePipe,&Security,0)) {
ZeroMemory( &start, sizeof(start) );
start.cb = sizeof(start);
start.hStdOutput = WritePipe;
start.hStdInput = ReadPipe;
start.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow = SW_HIDE;
if (CreateProcess(NULL,cmd, &Security, &Security, true,
NORMAL_PRIORITY_CLASS,NULL,NULL,&start, &ProcessInfo))
do
{
Apprunning = WaitForSingleObject(ProcessInfo.hProcess, 100) ; // обязательно
ReadFile(ReadPipe, Buffer, ReadBuffer, &BytesRead, NULL);
Buffer[BytesRead]= 0;
OemToAnsi(Buffer, Buffer);
memo->Text = memo->Text + Buffer;
Application->ProcessMessages();
}
while (Apprunning== WAIT_TIMEOUT) ;
//FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
}
}
crashtuak
07-05-2009, 07:47
Alan85, большое спасибо. Это уже большая часть того, что мне надо. Может потом еще вопросы будут, так напишу.
crashtuak
07-05-2009, 16:40
Данный цмд с такой реализацией неработает :(
@echo off
color 17
title L2EmuProject: Login Server Console
:start
echo Initializing L2EmuProject LoginServer.
echo.
SET OLDCLASSPATH=%CLASSPATH%
call setenv.bat
REM ########################################################################
REM # You need to set here your JDK/JRE params in case of x64 bits System. #
REM # Remove the "REM" after set PATH variable #
REM # If you're not a x64 system user just leave #
REM ########################################################################
REM set PATH="type here your path to java jdk/jre (including bin folder)"
java -Dfile.encoding=UTF-8 -Xmx64m net.l2emuproject.loginserver.L2LoginServer
SET CLASSPATH=%OLDCLASSPATH%
if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo Admin Restart ...
echo.
goto start
:error
echo.
echo LoginServer terminated abnormaly
echo.
:end
echo.
echo LoginServer terminated
echo.
pause
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.