Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ввод данных в консольное приложение [D7, WinXP]


A.L.E.X.A.N.D.E.R ©   (2007-06-18 21:05:00) 

Возник вопрос по поводу :
как ввести данные из своего приложения в работающее консольное приложение , т.е. типа gui
Подскажите пожалуйста .


Сергей М.   (2007-06-20 16:55:00) [1]


> A.L.E.X.A.N.D.E.R ©   (20.06.07 16:32) [15]


> Та епт


А нехрен, епт, влезать в работу приложения на полпути !

Стартуй его сам и управляй им через анонимный пайп - би будет тебе полное счастье ! Епт)


A.L.E.X.A.N.D.E.R   (2007-06-20 16:32:00) [2]

Та епт , что делать если консольное приложение нивкакаю не воспринимает введеный в него текст ?


Сергей М.   (2007-06-20 16:09:00) [3]


> SLoW.AlfaMoon.Com   (20.06.07 16:03) [13]


Не парься, уважаемый.

Просто смею рекомендовать "включать свой телепатор" тогда когда автор явно хоть чуть-чуть "шарит"


SLoW.AlfaMoon.Com   (2007-06-20 16:03:00) [4]

Хм. Замечание верное. Тогда могу предложить недокументированное решение через Native API, только это, как мне кажется, автору не нужно. И вообще, это всего лишь пример.

Еще +1 к предложению clickmaker.


Сергей М.   (2007-06-20 15:07:00) [5]


> SLoW.AlfaMoon.Com   (20.06.07 15:00) [11]
>
>


> GetProcessId


А ну как совсем не тот процесс твой код обнаружит ?

Мало ли м.б. процессов с указанным именем)


SLoW.AlfaMoon.Com   (2007-06-20 15:00:00) [6]


function AttachConsole(dwProcessId: DWORD): BOOL; stdcall; external 'kernel32.dll';

function GetProcessId(pName: PChar): dword;
var
Snap: dword;
 Process: TPROCESSENTRY32;
begin
 Result := 0;
 Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if Snap <> INVALID_HANDLE_VALUE then
    begin
     Process.dwSize := SizeOf(TPROCESSENTRY32);
     if Process32First(Snap, Process) then
        repeat
         if lstrcmpi(Process.szExeFile, pName) = 0 then
            begin
             Result := Process.th32ProcessID;
             CloseHandle(Snap);
             Exit;
            end;
        until not Process32Next(Snap, Process);
     Result := 0;
     CloseHandle(Snap);
    end;
end;


Сергей М.   (2007-06-20 14:57:00) [7]


> но оно не воспринимает этого


Что, прямо так и говорит, мол, не воспринимаю и все тут ?


> даже стереть , то что я написал своей программой невозможно


"Что написано пером -  не вырубишь ..." (с)


A.L.E.X.A.N.D.E.R   (2007-06-20 14:33:00) [8]

Разобрался , спасибо .
Теперь встала ещё 1 проблема , всё что я ввожу в консольное приложение оно в нём вывожит , но оно не воспринимает этого , даже стереть , то что я написал своей программой невозможно .


A.L.E.X.A.N.D.E.R   (2007-06-20 13:43:00) [9]

хм... уже "GetProcessId" не работает ...


clickmaker   (2007-06-20 13:43:00) [10]


> [6] A.L.E.X.A.N.D.E.R ©   (20.06.07 13:33)

см. Creating a Child Process with Redirected Input and Output в MSDN


A.L.E.X.A.N.D.E.R   (2007-06-20 13:33:00) [11]

c "GetProcessId" разобрался , а вот с "AttachConsole" - никак .


A.L.E.X.A.N.D.E.R   (2007-06-20 13:06:00) [12]

А какие модули ещё надо подключить , а то Delphi у меня ругается на "GetProcessId" и на "AttachConsole" .


SLoW.AlfaMoon.Com   (2007-06-20 10:50:00) [13]

Проблема банально решилась добавлением Sleep(500) после строчки с WinExec'om. Ну или экспериментируйте с CreateProcess


SLoW.AlfaMoon.Com   (2007-06-20 10:33:00) [14]

Впрочем, я, похоже, поторопился. НАлицо наличие некоторых проблем с функцией AttachConsole.

http://www.wasm.ru/forum/viewtopic.php?pid=125645--- здесь обсуждение похожего вопроса.

ПРимер, наскоро накиданный мной:

procedure TForm1.Button1Click(Sender: TObject);
 var h,w: THandle;
     ncw,pid: dword;
     buf: array[0..5] of char;
begin
 buf[0] := 't';
 buf[1] := 'e';
 buf[2] := 's';
 buf[3] := 't';
 buf[4] := #0;
 h := WinExec('cmd.exe',SW_SHOW);
 pid := GetProcessId('cmd.exe');
 if pid = 0 then begin showmessage('pid=0');exit;end;
 if AttachConsole(pid) then
 begin
   w := GetStdHandle(STD_OUTPUT_HANDLE);
   WriteConsole(w,@buf[0],4,ncw,nil);
   FreeConsole;
 end else showmessage('attach failed:'+inttostr(getlasterror));

end;


Тут получаются такие сложности. Имею запущенный cmd.exe. Проходя код под отладчиком, все получается хорошо. При запуске без отладчика AttachConsole возвращает ошибку 6 - Invalid Handle.


A.L.E.X.A.N.D.E.R   (2007-06-19 23:45:00) [15]

А можно пожалуйста пример ?
просто ньюансов там многовато .


SLoW.AlfaMoon.Com   (2007-06-19 10:21:00) [16]

AttachConsole + WriteConsoleInput.


Наверх

Титульная страница Поиск, карта сайта Написать письмо