Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2015, 15:37   #1
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию cmd окно через Exec и WinExec

Всем Привет!

нашел исходник
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, ShellAPI;

type
  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    btn1: TButton;
    btn2: TButton;
    edt1: TEdit;
    mmo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type // Тип матриц перекодировки
  TCodeMatrix = array[1..255] of char;
const // Матрицы перекодировки
  FirstCodes =
    #1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28+
   #29#30#31' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^' +
    '_`abcdefghijklmnopqrstuvwxyz{|}~';
  cmAnsiToKoi8R: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·Ј—є»јЅѕїбвчздецъй'
    + 'клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
  cmOemDosToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп---¦+¦¦¬¬¦¦¬---¬L+T+-+¦¦L'
    + 'г¦T¦=+¦¦TTLL-г++----¦¦-рстуфхцчшщъыьэюяЁёЄєЇїЎў°•·v№¤¦ ';
  cmIsoToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + '????????????????????????˜??????? ЁЂЃЄЅІЇЈЉЊЋЌ*ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШ'
    + 'ЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ';

var
  Form1: TForm1;

implementation

{$R *.dfm}

Procedure SaveLog(Text1: AnsiString);
var
  f: TextFile;       // файл
  fName: String[80]; // имя файла
  strDate: string;
  y, m, d, h, i, s, ms: word;
begin
   decodeDate(now, y, m, d);
   decodeTime(now, h, i, s, ms);

   StrDate:=IntToStr(y)+'-';
   if m < 10 then
   StrDate:=StrDate+'0'+IntToStr(m)+'-'
   else
   StrDate:=StrDate+IntToStr(m)+'-';

   if d < 10 then
   StrDate:=StrDate+'0'+IntToStr(d)+' '
   else
   StrDate:=StrDate+IntToStr(d)+' ';

   if h < 10 then
   StrDate:=StrDate+'0'+IntToStr(h)+':'
   else
   StrDate:=StrDate+IntToStr(h)+':';

   if i < 10 then
   StrDate:=StrDate+'0'+IntToStr(i)+':'
   else
   StrDate:=StrDate+IntToStr(i)+':';

   if s < 10 then
   StrDate:=StrDate+'0'+IntToStr(s)+' - ('+IntToStr(ms)+')'
   else
   StrDate:=StrDate+IntToStr(s)+' - ('+IntToStr(ms)+')';

   fName := 'history.txt';
   AssignFile(f, fName);

   If FileExists(fName) = False Then// Если файл не существует
   Rewrite(f)  // Открыть для перезаписи
   Else Append(f);  // открыть для добавления

	 WriteLn(f, '------------------------');
   WriteLn(f, '   ' + StrDate);
   WriteLn(f, '   ' + text1);

   CloseFile(f); // закрыть файл

end;

function ConvertEncoding(sIn: string; sCoding: string): string;
//sIn - строка для перекодирования
//sCoding - матрица для перекодирования
//result - полученная перекодированная строка
var
  iFtd: integer;
begin
  for iFtd := 1 to length(sIn) do
    result := result + sCoding[ord(sIn[iFtd])];
end;

Function ShellExec(Commands: AnsiString): String;
var
   WshShell, Resc: Variant;
begin
   WshShell:=createOLEObject('WScript.Shell');
   Resc:=WshShell.Exec(commands);
   result:=Resc.StdOut.ReadAll;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// create form

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// close form
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// button1
   Edt1.Text := 'net view';
   SaveLog(Edt1.Text);
   Mmo1.Text:=ConvertEncoding(ShellExec(Edt1.Text), cmoemdostoansi);
   SaveLog(Mmo1.Text);
   Mmo1.setFocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// button2
 	Close();
 	Application.Terminate();
end;

end.
все работает красиво но хотелось бы скрыть "досовое" окно, пробовал менять
Код:
Resc:=WshShell.Exec(commands);
на
Код:
Resc:=WshShell.WinExec(commands, SW_HIDE);
вываливает ошибку

Код:
   WshShell:=createOLEObject('WScript.Shell');
   Resc:=WshShell.Exec(commands);
   result:=Resc.StdOut.ReadAll;
ничего не смыслю кроме команды Exec... приблизительно понимаю что создается объект, запускается команда на выполнение и в result пишется результат, но...

помогите
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 02.09.2015, 15:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
вываливает ошибку
Текст ошибки засекречен полицией нравов?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2015, 15:48   #3
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Текст ошибки засекречен полицией нравов?
вот скрин:
Изображения
Тип файла: jpg error.JPG (21.3 Кб, 51 просмотров)
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 02.09.2015, 15:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит его можно только в скриптах юзать, если он есть.
Еще вопрос. А почему не хочешь воспользоваться таким вот способом: http://www.programmersforum.ru/showthread.php?t=108745
?
Я им раньше пользовался частенько.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2015, 16:17   #5
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Значит его можно только в скриптах юзать, если он есть.
Еще вопрос. А почему не хочешь воспользоваться таким вот способом: http://www.programmersforum.ru/showthread.php?t=108745
?
Я им раньше пользовался частенько.
попробовал, все норм, код
Код:
...
type // Тип матриц перекодировки
  TCodeMatrix = array[1..255] of char;
const // Матрицы перекодировки
  FirstCodes =
    #1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28+
   #29#30#31' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^' +
    '_`abcdefghijklmnopqrstuvwxyz{|}~';
  cmOemDosToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп---¦+¦¦¬¬¦¦¬---¬L+T+-+¦¦L'
    + 'г¦T¦=+¦¦TTLL-г++----¦¦-рстуфхцчшщъыьэюяЁёЄєЇїЎў°•·v№¤¦ ';
  cmIsoToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + '???????????????????????????????? ЁЂЃЄЅІЇЈЉЊЋЌ*ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШ'
    + 'ЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ';
...
function ConvertEncoding(sIn: string; sCoding: string): string;
//sIn - строка для перекодирования
//sCoding - матрица для перекодирования
//result - полученная перекодированная строка
var
  iFtd: integer;
begin
  for iFtd := 1 to length(sIn) do
    result := result + sCoding[ord(sIn[iFtd])];
end;

procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:
  TStringList);
var
  sa: TSECURITYATTRIBUTES;
  si: TSTARTUPINFO;
  pi: TPROCESSINFORMATION;
  hPipeOutputRead: THANDLE;
  hPipeOutputWrite: THANDLE;
  hPipeErrorsRead: THANDLE;
  hPipeErrorsWrite: THANDLE;
  Res, bTest: Boolean;
  env: array[0..MAX_PATH] of Char;
  szBuffer: array[0..MAX_PATH] of Char;
  dwNumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  sa.nLength := sizeof(sa);
  sa.bInheritHandle := true;
  sa.lpSecurityDescriptor := nil;
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
  CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
  ZeroMemory(@env, SizeOf(env));
  ZeroMemory(@si, SizeOf(si));
  ZeroMemory(@pi, SizeOf(pi));
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  si.hStdInput := 0;
  si.hStdOutput := hPipeOutputWrite;
  si.hStdError := hPipeErrorsWrite;

  (* Remember that if you want to execute an app with no parameters you nil the
     second parameter and use the first, you can also leave it as is with no
     problems.                                                                 *)
  Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);

  // Procedure will exit if CreateProcess fail
  if not Res then
  begin
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);
    CloseHandle(hPipeErrorsRead);
    CloseHandle(hPipeErrorsWrite);
    Exit;
  end;
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);

  //Read output pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Output.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;

  //Read error pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Errors.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;

  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
OutP, ErrorP : TStringList;
begin
OutP := TStringList.Create;
  ErrorP := TstringList.Create;

  ExecConsoleApp('ping 192.168.1.1', OutP, ErrorP);

  Memo1.Text := ConvertEncoding(OutP.Text, cmoemdostoansi);
  Memo2.Text := ConvertEncoding(ErrorP.Text, cmoemdostoansi);

  OutP.Free;
  ErrorP.Free;
end;
но смущает что нету адреса, почему?
Изображения
Тип файла: jpg screen.JPG (45.1 Кб, 107 просмотров)
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 02.09.2015, 16:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А Х его З...
Я так не скажу... ConvertEncoding если убрать тоже не будет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2015, 16:38   #7
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А Х его З...
Я так не скажу... ConvertEncoding если убрать тоже не будет?
если убрать тоже самое (нету адреса) + вместо кириллицы "кряказяблы"
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 02.09.2015, 16:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну тут я тебе не отвечу пожалуй...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2015, 17:43   #9
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
ДралсяСошибками вне форума Ответить с цитированием
Старый 02.09.2015, 22:25   #10
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от ДралсяСошибками Посмотреть сообщение
Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
я так понимаю это к ПЕРВОМУ исходнику (который в первом посте), верно?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают файловые операции через cmd\bat 100GRamm Операционные системы общие вопросы 8 26.04.2013 13:21
узнать ip адрес сервера в локальной сети через cmd ArtemSakh Windows 6 20.01.2013 08:58
Cmd через Паскаль zhenka619 Паскаль, Turbo Pascal, PascalABC.NET 9 17.08.2012 13:40
Ввод строк через CMD (командная строка) RIO Общие вопросы C/C++ 2 26.04.2011 02:00
Доступ к MySQL через CMD Phantom SQL, базы данных 2 11.06.2010 17:33