monrus
Опытный
Offline
|
|
« : 02-07-2006 15:22 » |
|
Как сделать GUI-оболочку к консольной проге, чтобы можно было передавать в строку некие аргументы. Дайте примеры.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 02-07-2006 19:24 » |
|
monrus, легче к GUI приложению привинтить консоль. Делаеш отдельно два приложения. Из GUI приложения запускаеш консоль и через сокеты или pipe передаеш данные на консоль. Можно в принципе и консоль напрямую вызывать. Только это надо будет покопаться в MSDN. Я как-то натыкался на статьи по созданию консоли.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #2 : 03-07-2006 04:26 » |
|
В дельфях делается до безобразия просто: unit Unit1; {$APPTYPE CONSOLE}
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Writeln('Eto stroka Edit1: ', Edit1.Text); end;
end.
|
|
« Последнее редактирование: 06-12-2007 18:55 от Алексей1153++ »
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #3 : 03-07-2006 15:12 » |
|
Боюсь, мы друг друга не поняли. Приведу пример: все вы знаете прогу UPX, которая работает ч/з командную строку. Как, например, к ней сделать оболочку, чтобы можно было передавть ей различные аргументы. или оболочка к компилятору, к примеру. Меня просто интересует как это все работает. Спасибо, что помогаете.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 03-07-2006 16:29 » |
|
Вот пример из MSDN, Как это делать
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #5 : 03-07-2006 17:00 » |
|
А на дельфи ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #6 : 03-07-2006 17:33 » |
|
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #7 : 04-07-2006 14:39 » |
|
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #8 : 04-07-2006 15:27 » |
|
Блин не понимаю. Дайте пример реальной программы. Please.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #9 : 04-07-2006 15:47 » |
|
monrus, по ссылке приведён готовый код реальной программы, которая запускает ping 127.0.0.1 и выводит результат её работы в TMemo.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #10 : 04-07-2006 16:50 » |
|
Она у меня не работает, хоть тупым я себя не считаю.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #11 : 04-07-2006 16:51 » |
|
там еще и синтаксис чем-то левым заменен
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #12 : 04-07-2006 16:53 » |
|
х77, пришли мне пожалуйста эту прогу.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #13 : 05-07-2006 04:09 » |
|
Может это тебе поможет: const RETURN_INVALID_HANDLE = MaxInt; RETURN_EXECUTE_FAILED = MaxInt - 1;
function ExecuteWait(Command, Params: string; ShowWindow: Word; Output: TStrings): Cardinal;
function GetTempFile: string; var bFile, bDir: Array [0..255] of char; begin GetTempPath(SizeOf(bDir), bDir); GetTempFileName(bDir, 'tmp', 0, bFile); Result := bFile; end;
var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; hOut: THandle; tempfile: string; workingdir: PChar; begin ZeroMemory(@StartupInfo, SizeOf(TStartupInfo)); ZeroMemory(@ProcessInfo, SizeOf(TProcessInformation)); ZeroMemory(@SecurityAttr, SizeOf(TSecurityAttributes));
tempfile := GetTempFile;
with SecurityAttr do begin nLength := SizeOf(TSecurityAttributes); lpSecurityDescriptor := nil; bInheritHandle := True; end;
hOut := CreateFile(PChar(tempfile), GENERIC_READ or GENERIC_WRITE, 0, @SecurityAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, 0);
if hOut = INVALID_HANDLE_VALUE then Result := RETURN_INVALID_HANDLE else begin with StartupInfo do begin cb := SizeOf(TStartupInfo); wShowWindow := ShowWindow; dwFlags := STARTF_USESHOWWINDOW; if Assigned(Output) then begin hStdOutput := hOut; hStdError := hOut; hStdInput := GetStdHandle(STD_INPUT_HANDLE); dwFlags := dwFlags or STARTF_USESTDHANDLES; end; end;
if ExtractFilePath(Command) <> '' then workingdir := PChar(ExtractFilePath(Command)) else workingdir := nil;
if Pos(' ', Command) <> 0 then Command := '"' + Command + '"';
if CreateProcess(nil, PChar(Command + ' ' + Params), nil, nil, True, 0, nil, workingdir, StartupInfo, ProcessInfo) then begin WaitForSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(hOut); if Assigned(Output) then Output.LoadFromFile(tempfile); DeleteFile(tempfile); end else begin CloseHandle(hOut); DeleteFile(tempfile); Result := RETURN_EXECUTE_FAILED; end; end;
end;
|
|
« Последнее редактирование: 06-12-2007 18:56 от Алексей1153++ »
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #14 : 07-07-2006 13:32 » |
|
дайтн реальные сорцы с выводом в консоль
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #15 : 07-07-2006 17:10 » |
|
Блин, называется дал го..на, давай и ложку procedure TForm1.Button1Click(Sender: TObject); var str:TStringList; begin str:=TStringList.Create; try ExecuteWait('ping', '127.0.0.1', SW_HIDE, str); Memo1.Lines.Assign(str); finally str.Free; end; end;
|
|
« Последнее редактирование: 06-12-2007 18:57 от Алексей1153++ »
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #16 : 07-07-2006 19:49 » |
|
вот пример вашей проги. Но она выводит данные из консоли в мемо. А мне нужно наоборот. чтобы я вводил данные, к примеру, "/?" и эти данные передавались в консольную прогу. Пожалуйста, модифицируйте ее. Очень хочу научиться работать с этим.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #17 : 09-07-2006 14:24 » |
|
monrus, Ты так нефига не научишся. Это сто пудово. Дали тебе готовые сырци, работаюшие в обратном направлении. Ну так сделай их в прямом. Будет тебе практика, чтобы руку набить и самому понять. Разбирая чужой код, ты не научишся программировать. Пока сам не начнеш писать.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Антон (LogRus)
|
|
« Ответ #18 : 09-07-2006 17:29 » |
|
monrus, согласен с Fintch'ем или ты используешь уже полученные данные или фиг ты чему научишься, твоя задача написания front-end интерфейса решается путём подмены потоков ввода вывода у внешней програмы. есть такой вызов dup. есть такой сайт delphikingdom.ru
|
|
« Последнее редактирование: 06-12-2007 18:58 от Алексей1153++ »
|
Записан
|
Странно всё это....
|
|
|
|
zubr
Гость
|
|
« Ответ #20 : 09-07-2006 20:03 » |
|
Меня самого данная тема заинтерисовала, был час свободный - сварганил простенький интерпретатор консоли. Описание: 1. Вводишь командную строку в окошко Edit. 2. Нажимаешь кнопку Пуск. 3. В левом Memo отображается вывод консоли. 4. Для ввода данных, вводишь строку в правое Memo и нажимаешь кнопку Ввод. 5. Смотришь, что выводится в левом Memo.
Проект собран в Delphi6.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #21 : 10-07-2006 16:15 » |
|
zubr, брат, Будь Здоров! Теперь буду изучать.
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #22 : 10-07-2006 16:17 » |
|
zubr, брат, Будь Здоров! Теперь буду изучать.
|
|
|
Записан
|
|
|
|
|