Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

Ввод данных в консольное приложение   Найти похожие ветки 

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

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


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

AttachConsole + WriteConsoleInput.


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

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


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

Впрочем, я, похоже, поторопился. НАлицо наличие некоторых проблем с функцией 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.


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

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


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

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


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

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


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

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


 
clickmaker ©   (2007-06-20 13:43) [8]


> [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 14:33) [9]

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


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


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


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


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


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


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


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 15:07) [12]


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


> GetProcessId


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

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


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

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

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


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


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


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

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


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

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


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


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


> Та епт


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
2-1198171895
savyhinst
2007-12-20 20:31
2008.01.20
Сменить длину динамического массива строк из процедуры нельзя?


1-1192976166
Farel
2007-10-21 18:16
2008.01.20
Blob поля


2-1198062635
ммм_ызи
2007-12-19 14:10
2008.01.20
объединить насколько таблиц


15-1197825737
Lip
2007-12-16 20:22
2008.01.20
Ряд Тэйлора


15-1197341553
Slider007
2007-12-11 05:52
2008.01.20
С днем рождения ! 11 декабря 2007 вторник