Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-76857
Viktor1
2003-04-08 13:00
2003.04.24
Как определить таблица существует или нет?


3-76817
Vitalik S.
2003-04-05 12:18
2003.04.24
Как работать с типом BLOB Oracle8 через ODAC 4.05 в Delphi7


1-76872
Вадим
2003-04-12 01:29
2003.04.24
плавная прокрутка в TRichEdit


6-77068
Snake2000
2003-03-02 13:47
2003.04.24
NMSMTP - Обработка ошибок


3-76768
me2
2003-04-08 18:31
2003.04.24
Обновление данных у пользователей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский