Форум: "WinAPI";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
ВнизCreateProcess Найти похожие ветки
← →
Иксик (2003-02-26 13:41) [0]При запуске приложения CreateProcess"ом прогграмма останавливается на точке запуска и продолжает исполнение только после закрытия вызванной программы. Можно ли запустить приложение так, чтобы первое работало независимо от второго?
← →
Digitman (2003-02-26 14:06) [1]что и как ты стартуешь при пом. CreateProcess() ? Конкретно ?
← →
Иксик (2003-02-26 14:13) [2]procedure TForm1.Button1Click(Sender: TObject);
var
si : Tstartupinfo;
p : Tprocessinformation;
buff : ARRAY [0..127] OF Char;
str : string;
begin
FillChar( Si, SizeOf( Si ) , 0 );
with Si do begin
cb := SizeOf( Si);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;
//Application.Minimize;
Createprocess("notepad.exe",nil,nil,nil,false,Create_default_error_mode,nil,nil,si,p);
//Здесь она останавливается
Waitforsingleobject(p.hProcess,infinite);
GetWindowText(p.hProcess, buff, sizeof(buff));
str:=strpas(buff);
showmessage(str);
Application.Restore;
end;
← →
Digitman (2003-02-26 14:21) [3]ну и чего ты ерунду городишь ?)
ожиданием завершения стартованного приложения занимается ф-ция Waitforsingleobject(), а не CreateProcess().
Ты ж сам ее и вызвал, эту ф-цию Waitforsingleobject() !
Чего ж ты хочешь ? Пока юзер не закроет блокнот, твое приложение будет "торчать" на исполнении этой ф-ции ! На то и Waitforsingleobject().....)
← →
Внук (2003-02-26 14:34) [4]Строго, но справедливо... :)
По секрету добавлю, что "Wait" по-английски - "Ждать"
← →
Иксик (2003-02-26 14:48) [5]Во-первых это мне здесь посоветовали, а во-вторых чисто логически я подумал что такаким образом прога будет ждать фактического появления объекта По секрету это словосочетание означает ждать объект, а не ждать его исчезновения.
Я убрал эту строку, теперь он просто выдает пустое сообщение хотя должен выдавать caption созданного окна.
← →
Digitman (2003-02-26 14:56) [6]когда тебе что-то "советуют" - работай своей головой , а не чужой ! Фрагменты кода тебе дают как тему для детального исследования происходящего, а не для бездумного передирания.
Хэлп на Wait-ф-цию четко, черным по белому описывает то, как работает Wait-ф-ция для случая, когда объект представлен конкретно хэндлом процесса, а не чем-то иным
← →
Внук (2003-02-26 14:57) [7]Верно, ждать объект. Точнее - ждать, пока он перейдет в свободное состояние. В данном случае "объект" - это объект "процесс" подсистемы Win32 ОС Windows. А в свободное состояние он переходит после завершения всех исполнявшихся в нем потоков, то есть после завершения программы.
← →
Иксик (2003-02-26 15:06) [8]Ок, народ ругаться я тоже умею, ладно извините что хелп на wait-функцию не посмотрел, может все-таки поможете практически :)
Почему выдается пустое сообщение?
← →
paul_shmakov (2003-02-26 15:12) [9]для вашей задачи нужно WaitForInputIdle использовать, т.е. ждать, пока приложение (gui) загрузится и перейдет к ожиданию ввода пользователя.
только GetWindowText(p.hProcess, buff, sizeof(buff)); - это тоже неправильно. первый параметр должен быть HWND. к тому же нельзя с помощью GetWindowText получать текст из окон чужих приложений.
короче, читайте хелп дальше.
← →
Digitman (2003-02-26 15:15) [10]вместо WaitForSingleObject() поставь
WaitForInputIdle(p.hProcess,infinite);
всех делов !
Опять же - хэлп не читаешь на CreateProcess()
← →
UNIVERSAL (2003-02-26 15:15) [11]У меня тоже запарки с ф-ей GetWindowText, Правда ситуация другая немного. У меня ловится создание окон, а потом я хочу получить заголовок созданного окна, а заголовка то и нет, т.е. сначала вроде работала, а потом начала возвращать пустые заголовки. Только, вообще-то, в этой ф-ии не хендл процесса должен быть а хендл окна
← →
Иксик (2003-02-26 15:22) [12]У меня изначально стояла задача запустить внешнюю прогу и получить handle ее окна. Как это сделать?
← →
Digitman (2003-02-26 15:37) [13]
> Иксик
у внешней "проги" может быть несколько окон
любое окно, открытое "прогой" однозначно идентифицируется его св-вами КЛАСС ОКНА и/или ПОДПИСЬ ОКНА
← →
Иксик (2003-02-26 15:43) [14]А как получить КЛАСС ОКНА и/или ПОДПИСЬ ОКНА?
← →
UNIVERSAL (2003-02-26 15:49) [15]Если есть хендл процесса, то можно попробовать это
EnumThreadWindows
The EnumThreadWindows function enumerates all nonchild windows associated with a thread by passing the handle to each window, in turn, to an application-defined callback function. EnumThreadWindows continues until the last window is enumerated or the callback function returns FALSE. To enumerate child windows of a particular window, use the EnumChildWindows function.
BOOL EnumThreadWindows(
DWORD dwThreadId, // thread identifier
WNDENUMPROC lpfn, // callback function
LPARAM lParam // application-defined value
);
А вообще-то Digitman прав. У приложения может быть много окон
← →
Иксик (2003-02-26 16:09) [16]Хорошо, тогда по-другому. Допустим я запустил прогу createprocess"ом и теперь хочу манипулирорвать процессом, зная его хендл. Например я хочу его закрыть. Exitprocess(p.hProcess) почему-то закрывает мою программу, а не запущенную. Как закрыть запущенную прграмму?
← →
Digitman (2003-02-26 16:11) [17]
> Иксик (26.02.03 15:43)
> А как получить КЛАСС ОКНА и/или ПОДПИСЬ ОКНА?
его не "получать", его "знать" надо наперед)
← →
Иксик (2003-02-26 16:13) [18]
> Digitman
Знаешь, это мне очень помогло :)
← →
Digitman (2003-02-26 16:18) [19]Иксик
ну ты запусти утилитку типа WinSight да посмотри, какие окна открывает процесс блокнота, какие имена классов у интересующих тебя окон, какими трэдами они открываются
← →
Digitman (2003-02-26 16:21) [20]в конце-концов - можно поставить программный хук на сообщения, адресованные трэдам процесса блокнота ... в обработчике перехвата исследуй, какие окна каких классов открывает блокнот
← →
UNIVERSAL (2003-02-26 16:21) [21]TerminateProcess(p.dwProcessId,0);
← →
Иксик (2003-02-26 16:26) [22]Ок, всем большое спасибо!
← →
UNIVERSAL (2003-02-26 16:29) [23]
Извини обманул, точнее недоговорил. Вот энто работает:
var
Form1: TForm1;
si:TStartupInfo;
pi:TProcessInformation;
ph:thandle;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
GetStartupInfo(si);
createprocess("d:\winnt\system32\notepad.exe",nil,nil,nil,false,Create_default_error_mode,nil,nil,si,pi);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ph:=OpenProcess(PROCESS_TERMINATE,false, pi.dwProcessId);
TerminateProcess(ph,1);
end;
← →
Иксик (2003-02-26 16:31) [24]Я все также сделал, только
procedure TForm1.Button2Click(Sender: TObject);
begin
TerminateProcess(ph,0);
end;
Так работает.
Сначала я сделал так:
procedure TForm1.Button2Click(Sender: TObject);
var excode:cardinal;
begin
GetExitCodeProcess(p.hProcess,excode);
terminateprocess(p.hProcess,excode);
end;
, но потом передумал
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c