![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Привет. Хочу перезагрузить exploler.exe
Код:
WinExec ('taskkill /f /im explorer.exe', sw_hide)
WinExec ('explorer.exe', sw_hide);первая команда убивает его, а вторая запускает, но они срабатывают одновременно. Как сделать чтобы сначала сработала первая, а потом вторая! Через условие, но как проверить строку на выполненность? Спасибо! Жду ответа! |
|
#2
|
||||
|
||||
|
Не знаю, где и как сейчас учат программированию, но вообще-то обычный процессор (который стоит в PC) никогда не выполняет инструкции одновременно (тем более функции). Выполняется сначала одна, потом другая. Всегда обе и всегда в том порядке, в каком они написаны. Другое дело, что TaskKill скорее всего не успеет выключить процесс. Решение "в лоб" - добавить между командами Sleep(N); где N - порядка 1000. Решение похитрее - ждать завершения работы TaskKill. А решение третье, ИМХО более адекватное - TerminateProcess. Правда тут надо уже уметь работать с WinAPI.
Последний раз редактировалось Bargest, 24.12.2011 в 16:19. |
|
#3
|
|||
|
|||
|
Ф-я dwExecAndWait запускает процесс и ждет его завершения (из dwUnits).
Используй вместо WinExec. Код:
procedure dwProcessMessages;
var
Msg: TMsg;
begin
while PeekMessage(Msg, GetCurrentProcess, 0, 0, PM_REMOVE) do
//if not IsDialogMessage(Dlg, Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
procedure dwExecAndWait(const FileName, Params: String; const CmdShow: Integer);
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
ExInfo.lpVerb := 'open';
ExInfo.lpParameters := PChar(Params);
lpFile := PChar(FileName);
nShow := CmdShow;
end;
if ShellExecuteEx(@exInfo) then
Ph := exInfo.HProcess
else
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
dwProcessMessages;
CloseHandle(Ph);
end; |
|
#4
|
|||
|
|||
|
Да, пока ещё не учат, я сам пытаюсь разобраться, и не нужно глумиться, все мы чему-то учимся первый раз! Но за критику спасибо!
|
|
#5
|
||||
|
||||
|
Я не глумлюсь. Я просто считаю, что прежде чем браться писать программы (ну кроме разве что "Hello, world!"), нужно изучить устройство и принципы работы компьютера, хотя бы примерно. А то программирование может стать вида "Ну вот я написал такую строчку и подключил такой компонент, вот оно должно за меня все сделать", в то время как должно целиком и полностью состоять из осмысленных действий. Я исключительно доброжелателен.
![]() |