Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.07.2011, 16:56
Аватар для bender42
bender42 bender42 вне форума
Прохожий
 
Регистрация: 10.04.2011
Сообщения: 11
Репутация: 10
Восклицание Вывод консоли в memo + Открытие архива .img

доброе время суток.
вот возник вопрос как перехватить консоль
суть в том чтоб memo полностью стало консолью каторую я хочу перехватить и реализовать работу с файломи
консоль это colinux запускающийся с параметром

Код:
colinux-daemon.exe -t nt @server/server.conf fastboot nogui

Скрин работы с файломи:
http://s012.radikal.ru/i321/1107/5a/13387010e367.jpg
=================================== =======================
Открытие архива .img
нужно открыть файл из этого образа 123.img и отредактировать строки в нём
чтоб они выводились в Edit1,Edit2,Edit3 и т.п
место расположение файла мне изветно
если это чтото изменит скрин консоли colinux
при запуски
http://s015.radikal.ru/i332/1107/7d/26ac1525ecf8.jpg
и скрин файла
http://s014.radikal.ru/i326/1107/9c/20c6905b07ca.jpg
Если вам нетрудно поделитесь исходником или кодом=(
За рание спосибо.
Ответить с цитированием
  #2  
Старый 21.07.2011, 17:02
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Лови модуль, буквально вчера писал. Точно знаю что работает на Delphi XE, про остальные версии 100% утверждать не берусь, но теоретически работать должно.
Код:
unit ConsoleAppRunner;

interface
uses
  Classes;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);

implementation
uses
  Windows,AnsiStrings;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
var
  securityattributes: TSecurityAttributes;
  startupinfo: TStartupInfoA;
  processinformation: TProcessInformation;
  hPipeInputRead: THandle;
  hPipeInputWrite: THandle;
  hPipeOutputRead: THandle;
  hPipeOutputWrite: THandle;
  WaitResult:Cardinal;
  buf: array [0..1023] of AnsiChar;
  dummy: Cardinal;
begin
  OutStrings.Append(#13#10);
  securityattributes.nLength:=SizeOf(TSecurityAttributes);
  securityattributes.lpSecurityDescriptor:=nil;
  securityattributes.bInheritHandle:=True;
  CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  startupinfo.cb:=SizeOf(TStartupInfo);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  startupinfo.wShowWindow:=SW_HIDE;
  startupinfo.hStdInput:=hPipeInputRead;
  startupinfo.hStdOutput:=hPipeOutputWrite;
  startupinfo.hStdError:=hPipeOutputWrite;
  OutStrings.BeginUpdate;
  OutStrings.Append(CmdLine+' '+Params);
  OutStrings.EndUpdate;
  if CreateProcessA(nil, PAnsiChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
    nil, PAnsiChar(AnsiStrings.ExtractFileDir(CmdLine)), startupinfo, processinformation) then
    begin
      repeat
        WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
        if ReadFile(hPipeOutputRead, buf, Length(buf), dummy, nil) then
          begin
            OemToAnsiBuff(buf, buf, dummy);
            OutStrings.BeginUpdate;
            OutStrings.Text:=OutStrings.Text+Copy(buf, 1, dummy);
            OutStrings.EndUpdate;
          end;
      until WaitResult<>WAIT_TIMEOUT;
      CloseHandle(processinformation.hProcess);
    end;
  CloseHandle(hPipeInputWrite);
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead);
end;
end.
Параметры:
CmdLine - exe-файл (указываем полный путь, далее этот путь будет использоваться как рабочий каталог)
Params - параметры
OutStrings - объект для вывода результатов (в самом простом варианте это Memo1.Lines)
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 22.07.2011, 16:11
Аватар для bender42
bender42 bender42 вне форума
Прохожий
 
Регистрация: 10.04.2011
Сообщения: 11
Репутация: 10
По умолчанию

Код:
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
var
  securityattributes: TSecurityAttributes;
  startupinfo: TStartupInfoA;//тут ругается и после этого на всё остальное
  processinformation: TProcessInformation;
  hPipeInputRead: THandle;
  hPipeInputWrite: THandle;
  hPipeOutputRead: THandle;
  hPipeOutputWrite: THandle;
  WaitResult:Cardinal;
  buf: array [0..1023] of AnsiChar;
  dummy: Cardinal;
begin
  OutStrings.Append(#13#10);
  securityattributes.nLength:=SizeOf(TSecurityAttributes);
  securityattributes.lpSecurityDescriptor:=nil;
  securityattributes.bInheritHandle:=True;
  CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  startupinfo.cb:=SizeOf(TStartupInfo);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  startupinfo.wShowWindow:=SW_HIDE;
  startupinfo.hStdInput:=hPipeInputRead;
  startupinfo.hStdOutput:=hPipeOutputWrite;
  startupinfo.hStdError:=hPipeOutputWrite;
  OutStrings.BeginUpdate;
  OutStrings.Append(CmdLine+' '+Params);
  OutStrings.EndUpdate;
  if CreateProcessA(nil, PAnsiChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
    nil, PAnsiChar(AnsiStrings.ExtractFileDir(CmdLine)), startupinfo, processinformation) then
    begin
      repeat
        WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
        if ReadFile(hPipeOutputRead, buf, Length(buf), dummy, nil) then
          begin
            OemToAnsiBuff(buf, buf, dummy);
            OutStrings.BeginUpdate;
            OutStrings.Text:=OutStrings.Text+Copy(buf, 1, dummy);
            OutStrings.EndUpdate;
          end;
      until WaitResult<>WAIT_TIMEOUT;
      CloseHandle(processinformation.hProcess);
    end;
  CloseHandle(hPipeInputWrite);
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead);
end;

end.

вот=\
Ответить с цитированием
  #4  
Старый 23.07.2011, 07:47
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Замени TStartupInfoA на TStartupInfo
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 23.07.2011, 10:58
Аватар для bender42
bender42 bender42 вне форума
Прохожий
 
Регистрация: 10.04.2011
Сообщения: 11
Репутация: 10
По умолчанию

http://i027.radikal.ru/1107/78/80f1409ff0e2.jpg
вот чё выдаёт щяс
Ответить с цитированием
  #6  
Старый 23.07.2011, 14:06
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Убери AnsiStrings из Uses, он мне только для XE нужен был.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 23.07.2011, 15:38
Аватар для bender42
bender42 bender42 вне форума
Прохожий
 
Регистрация: 10.04.2011
Сообщения: 11
Репутация: 10
По умолчанию

http://s61.radikal.ru/i171/1107/94/a04d12682f74.jpg
В вложении исходник ато я чёт ваше запутался=\
Вложения
Тип файла: rar работа с консолью.rar (167.3 Кбайт, 12 просмотров)

Последний раз редактировалось bender42, 23.07.2011 в 16:06.
Ответить с цитированием
  #8  
Старый 24.07.2011, 10:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

http://data.cod.ru/116844
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 04.08.2011, 12:57
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Допилил я таки модуль для запуска консольных приложений, чтобы он нормально работал в XE
Кому не влом, протестируйте на семерке к примеру, ну или на любой дельфе которая не юникодовская.
Код:
unit ConsoleAppRunner;

interface
uses
  Classes;
procedure RunConsoleApplication(CmdLine,Params:String;OutStrings:TStrings);

implementation
uses
  SysUtils,Windows;
const
  UnprintableSymbols = [
    #$00,#$01,#$02,#$03,#$04,#$05,#$06,#$07,#$08,#$09,#$0A,#$0B,#$0C,#$0D,#$0E,#$0F,
    #$10,#$11,#$12,#$13,#$14,#$15,#$16,#$17,#$18,#$19,#$1A,#$1B,#$1C,#$1D,#$1E,#$1F,
    #$7F
                        ];
type
  TAnsiBuf = array [0..1023] of AnsiChar;
  TCharBuf = array [0..1023] of Char;
procedure MoveLeft(var Data:TAnsiBuf; From,Len,Shift:integer);
var
  i:integer;
begin
  for i := From to From+Len do
    Data[i]:=Data[i-Shift];
end;
procedure AnsiBufToCharBuf(AnsiBuf:TAnsiBuf;var CharBuf:TCharBuf;Len:integer);
var
  i:integer;
begin
  for I := 0 to Len do
    begin
      if CharInSet(AnsiBuf[i],UnprintableSymbols) then
        CharBuf[i]:=Char(AnsiBuf[i])
      else
        OemToChar(@AnsiBuf[i],@CharBuf[i]);
    end;
end;
procedure RunConsoleApplication(CmdLine,Params:String;OutStrings:TStrings);
var
  securityattributes: TSecurityAttributes;
  startupinfo: TStartupInfo;
  processinformation: TProcessInformation;
  hPipeInputRead: THandle;
  hPipeInputWrite: THandle;
  hPipeOutputRead: THandle;
  hPipeOutputWrite: THandle;
  WaitResult:Cardinal;
  AnsiBuf: TAnsiBuf;
  CharBuf: TCharBuf;
  dummy: Cardinal;
  s:string;
begin
//  OutStrings.Append(#13#10);              //<---------
  securityattributes.nLength:=SizeOf(TSecurityAttributes);
  securityattributes.lpSecurityDescriptor:=nil;
  securityattributes.bInheritHandle:=True;
  CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  with startupinfo do
    begin
      cb:=SizeOf(TStartupInfo);
      dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow:=SW_HIDE;
      hStdInput:=hPipeInputRead;
      hStdOutput:=hPipeOutputWrite;
      hStdError:=hPipeOutputWrite;
    end;
  OutStrings.BeginUpdate;
  OutStrings.Append(CmdLine+' '+Params);
  OutStrings.EndUpdate;
  if CreateProcess(nil, PChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
    nil, PChar(ExtractFileDir(CmdLine)), startupinfo, processinformation) then
    begin
      repeat
        WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
        if ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy, nil) then
          begin
            AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
            OutStrings.BeginUpdate;
            OutStrings.Text:=OutStrings.Text+Copy(CharBuf, 1, dummy);
//            if Pos(#8,OutStrings.Text)>0 then  //<---------
//              begin                            //<---------
//                s:=OutStrings.Text;            //<---------
//                Delete(s,Pos(#8,s)-3,4);       //<---------
//                OutStrings.Text:=s;            //<---------
//              end;                             //<---------
            OutStrings.EndUpdate;
          end;
      until WaitResult<>WAIT_TIMEOUT;
      CloseHandle(processinformation.hProcess);
    end
  else
    begin
      OutStrings.BeginUpdate;
      OutStrings.Append(SysErrorMessage(GetLastError));
      OutStrings.EndUpdate;
    end;
  CloseHandle(hPipeInputWrite);
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead);
end;
end.
на закомментаренные строчки внимания не обращайте, это мне нужно для внутренних нужд (тафталогия блин).
пример вызова:
Код:
uses ConsoleAppRunner;
...
  RunConsoleApplication('c:\windows\system32\ping.exe','192.168.104.104',ListBox1.Items);
ЗЫЖ Естественно консоль эмулируется не на 100%
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #10  
Старый 04.08.2011, 13:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

CharInSet появилась в Дельфи 2009.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 04.08.2011, 13:12
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Ну это не трудно поправить.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #12  
Старый 04.08.2011, 13:29
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

После доработки запускается в 5 и 7 Дельфи.
P.S. По указанному адресу, отказали в доступе.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 04.08.2011 в 13:32.
Ответить с цитированием
  #13  
Старый 04.08.2011, 13:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Склероз. Для использования CharInSet в не юникодных версиях Дельфи, добавляем:
Код:
unit util;

{$H+,B-,R-}

interface

uses
  Windows, Messages;

{$I Common.inc}
  
type
  TSysCharSet		= set of AnsiChar;
  TCharSet		= TSysCharSet;

//======================= SysUtils =========================

function  CharInSet(C : AnsiChar; const CharSet : TSysCharSet) : Boolean; overload;{$IFDEF D10} inline;{$ENDIF}
function  CharInSet(C : WideChar; const CharSet : TSysCharSet) : Boolean; overload;{$IFDEF D10} inline;{$ENDIF}

implementation

const
{$IFDEF D5}
  CSTR_EQUAL = 2;
{$ENDIF}  

//---------------------------------------------------------
//                         SysUtils
//---------------------------------------------------------

function CharInSet(C : AnsiChar; const CharSet : TSysCharSet) : Boolean;
begin
  Result := C in CharSet;
end;

//---------------------------------------------------------

function CharInSet(C : WideChar; const CharSet : TSysCharSet) : Boolean;
begin
  Result := (C < #$0100) and (AnsiChar(C) in CharSet);
end;

//---------------------------------------------------------

end.
и Common.inc
Код:
{$IFDEF VER100} { Borland Delphi 3.0 }
  {$DEFINE D3}
{$ENDIF}
{$IFDEF VER120} { Borland Delphi 4.0 }
  {$DEFINE D3}
  {$DEFINE D4}
{$ENDIF}
{$IFDEF VER130} { Borland Delphi 5.0 }
  {$DEFINE D3}
  {$DEFINE D4}
  {$DEFINE D5}
{$ENDIF}
{$IFDEF VER140} { Borland Delphi 6.0 }
  {$DEFINE D3}
  {$DEFINE D4}
  {$DEFINE D5}
  {$DEFINE D6}
{$ENDIF}
{$IFDEF VER150} { Borland Delphi 7.0 }
  {$DEFINE D3}
  {$DEFINE D4}
  {$DEFINE D5}
  {$DEFINE D6}
  {$DEFINE D7}
{$ENDIF}
{$IFDEF VER180} { Borland Delphi 2006 }
  {$DEFINE D3}
  {$DEFINE D4}
  {$DEFINE D5}
  {$DEFINE D6}
  {$DEFINE D7}
  {$DEFINE D10}
{$ENDIF}
{$IFDEF VER200} { Borland Delphi 2009 }
  {$DEFINE D3}
  {$DEFINE D4}
  {$DEFINE D5}
  {$DEFINE D6}
  {$DEFINE D7}
  {$DEFINE D10}
  {$DEFINE D2009}
{$ENDIF}

{$IFDEF D7}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CODE OFF}

// These flags requires library DbgHelp.dll on Windows NT 4.0 
// and Windows 95/98/Me.
  {$SETPEFLAGS IMAGE_FILE_RELOCS_STRIPPED or
               IMAGE_FILE_DEBUG_STRIPPED or
               IMAGE_FILE_LINE_NUMS_STRIPPED or
               IMAGE_FILE_LOCAL_SYMS_STRIPPED or
               IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or
               IMAGE_FILE_NET_RUN_FROM_SWAP}
{$ENDIF}

{$IFDEF D2009}
  {$WARN IMPLICIT_STRING_CAST OFF}
  {$WARN IMPLICIT_STRING_CAST_LOSS OFF}
{$ENDIF}
или используем оператор IN.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025