C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Ответить
Аватара пользователя
crashtuak

C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Сообщение crashtuak »

Есть у нас пакетный файл. Надо его сокрыть и выводить все данные с него, например, в ТекстБокс в нашей программе. Ну и если в нашем цмд есть моменты, где надо вводить данные, то сделать поле на форме, с которого те данные будут ити в консоль.
Аватара пользователя
Alan85

Re: C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Сообщение Alan85 »

http://www.delphisources.ru/pages/fa...e_to_memo.html
- пример на делфи но думаю суть будет понятна - я могу транслировать на c++ borland если не разберешься
Аватара пользователя
Alan85

Re: C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Сообщение Alan85 »

Транслировал, но что-то не работает что понять не могу (возможно BDS 2006) - выдает ошибку при нажатие на кнопку - ошибка доступа к kernel32.dll (обычное исключение рунтайма). Стопится все на этой строчке

Код:

Код: Выделить всё

if (CreatePipe(ReadPipe,WritePipe,&Security,0))

.

Весь исходник :



Код:

Код: Выделить всё

//$$---- Form CPP ----
//---------------------------------------------------------------------------
#include 
#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);
}
//---------------------------------------------------------------------------
Аватара пользователя
Alan85

Re: C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Сообщение Alan85 »

Все разобрался:



Код:

Код: Выделить всё

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

Re: C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Сообщение crashtuak »

Alan85, большое спасибо. Это уже большая часть того, что мне надо. Может потом еще вопросы будут, так напишу.
Аватара пользователя
crashtuak

Re: C/C++ - bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы

Сообщение crashtuak »

Данный цмд с такой реализацией неработает Изображение



Код:

Код: Выделить всё

@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
Ответить

Вернуться в «Программирование и базы данных»