Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы (http://forum.oszone.net/showthread.php?t=139405)

crashtuak 06-05-2009 07:55 1111798

bat & cmd - сокрытие окна и вывод данных консоли в интерфейсе нашей программы
 
Есть у нас пакетный файл. Надо его сокрыть и выводить все данные с него, например, в ТекстБокс в нашей программе. Ну и если в нашем цмд есть моменты, где надо вводить данные, то сделать поле на форме, с которого те данные будут ити в консоль.

Alan85 06-05-2009 20:42 1112289

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

Alan85 06-05-2009 21:54 1112335

Транслировал, но что-то не работает что понять не могу (возможно 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);
}
//---------------------------------------------------------------------------


Alan85 06-05-2009 22:12 1112356

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

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 1112559

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

crashtuak 07-05-2009 16:40 1112962

Данный цмд с такой реализацией неработает :(
Код:

@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



Время: 15:23.

Время: 15:23.
© OSzone.net 2001-