Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ShellExecute: задержка выполнения программы до отработки внешней программы / 25 сообщений из 74, страница 1 из 3
05.12.2019, 10:49
    #39898452
BorodaOleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Вообщем, нужно запустить на исполнение gbak, приостановить программу на период его исполнения, и дождавшись окончания процесса продолжить.
Запускаю так:

Код: pascal
1.
2.
3.
4.
5.
6.
        . . .
        strPackPath := 'gbak -b -g -v ' + StrFrom + ' ' + StrTo + ' -user SYSDBA -password masterkey';
        pac := PChar('/C ' + strPackPath);
        HINST := ShellExecute(0,'open','cmd.exe',pac, 'C:\Windows\system32\',SW_SHOW);   
        case HINST of
        . . .



при этом остановки не происходит, сразу же отрабатывается следующий по ходу оператор, и.т.д., а gbak крутится в другом окне. Как вообще возможно приостановить исполнение кода, пока крутится внешнее окно? Если его контролировать с помощью таймера, то вообще непонятно по какому handle к нему обратится...
Может кто что подскажет?
...
Рейтинг: 0 / 0
05.12.2019, 10:52
    #39898454
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
...
Рейтинг: 0 / 0
05.12.2019, 10:57
    #39898461
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
почему именно ShellExecute?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 11:06
    #39898463
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
BorodaOleg
Может кто что подскажет?

Если есть gbak, то проще api воспользоваться. Там немного больше контроля, чем за окошком следить.
...
Рейтинг: 0 / 0
05.12.2019, 11:13
    #39898469
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
05.12.2019 11:06, wadman пишет:
> Если есть gbak, то проще api воспользоваться. Там немного больше
> контроля, чем за окошком следить.

api запускает процесс на СЕРВЕРЕ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 11:43
    #39898496
sg729
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
https://www.gunsmoker.ru/2015/01/never-use-ShellExecute.html
https://www.gunsmoker.ru/2009/07/createprocess.html

// Ожидание завершение приложения
while WaitforSingleObject(... и т.д.)
...
Рейтинг: 0 / 0
05.12.2019, 13:51
    #39898573
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Мимопроходящийapi запускает процесс на СЕРВЕРЕ.

И это получается гораздо быстрее. Хотя, конечно, в нынешней кривоватой реализации
локальный файл бэкапа и -v несовместимы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 13:59
    #39898580
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
BorodaOleg
Вообщем, нужно запустить на исполнение gbak, приостановить программу на период его исполнения, и дождавшись окончания процесса продолжить.
Запускаю так:

Код: pascal
1.
2.
3.
4.
5.
6.
        . . .
        strPackPath := 'gbak -b -g -v ' + StrFrom + ' ' + StrTo + ' -user SYSDBA -password masterkey';
        pac := PChar('/C ' + strPackPath);
        HINST := ShellExecute(0,'open','cmd.exe',pac, 'C:\Windows\system32\',SW_SHOW);   
        case HINST of
        . . .




при этом остановки не происходит, сразу же отрабатывается следующий по ходу оператор, и.т.д., а gbak крутится в другом окне. Как вообще возможно приостановить исполнение кода, пока крутится внешнее окно? Если его контролировать с помощью таймера, то вообще непонятно по какому handle к нему обратится...
Может кто что подскажет?

Про *Ex уже написали.
А зачем cmd.exe запускать, почему не сразу gbak?
...
Рейтинг: 0 / 0
05.12.2019, 14:09
    #39898587
BorodaOleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Спасибо всем за помощь. ShellExecuteEx подошел по всем параметрам.
Вот решение, может кому ещё понадобится:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
//  strPackPath := 'gbak -b -g -v ' + StrFrom + ' ' + StrTo + ' -user SYSDBA -password masterkey';
//  fName:= PChar('/C ' + strPackPath);   // /C закрывать окно CMD после окончания процесса
                                                            // /K по окончании процесса окно не закрывать 

procedure TArchBaseCopy.ExecDosApp(fName: PChar);
var ShExecInfo  : TShellExecuteInfo;
    ExitCode    : DWORD;
begin
  FillChar(ShExecInfo, SizeOf(TShellExecuteInfo), 0);
  ShExecInfo.cbSize := sizeof(TShellExecuteInfo);
  ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  ShExecInfo.Wnd := Handle;
  ShExecInfo.lpVerb := 'open';
  ShExecInfo.lpFile := 'cmd.exe';
  ShExecInfo.lpDirectory := 'C:\Windows\system32\';
  ShExecInfo.lpParameters := fName;
  ShExecInfo.nShow := SW_SHOW;
  if ShellExecuteEx(@ShExecInfo) and (ShExecInfo.hProcess <> 0) then
    repeat
    Application.ProcessMessages;
    GetExitCodeProcess(ShExecInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated
  else begin
    case ShExecInfo.hInstApp of
      0                      : SendEventBox(ET_RELEASE, 'Операционная успешна.');
      SE_ERR_FNF             : SendEventBox(ET_CRITICAL, 'Файл не найден');
      SE_ERR_PNF             : SendEventBox(ET_CRITICAL, 'Путь не найден');
      SE_ERR_ACCESSDENIED    : SendEventBox(ET_CRITICAL, 'Доступ к файлу запрещен');
      SE_ERR_OOM             : SendEventBox(ET_CRITICAL, 'He хватает памяти');
      SE_ERR_DLLNOTFOUND     : SendEventBox(ET_CRITICAL, 'He хватает памяти');
      SE_ERR_SHARE           : SendEventBox(ET_CRITICAL, 'Файл захвачен другим пользователем');
      SE_ERR_ASSOCINCOMPLETE : SendEventBox(ET_CRITICAL, 'Не полная информация о связанном с файлом приложении');
      SE_ERR_DDETIMEOUT      : SendEventBox(ET_CRITICAL, 'Истекло время на выполнение операции DDE');
      SE_ERR_DDEFAIL         : SendEventBox(ET_CRITICAL, 'Ошибочная операция DDE');
      SE_ERR_DDEBUSY         : SendEventBox(ET_CRITICAL, 'Операция DDE занята');
      SE_ERR_NOASSOC         : SendEventBox(ET_CRITICAL, 'Нет приложения, связанного с файлом');
      else SendEventBox(ET_RELEASE, 'Код ошибки не инициализирован: ' + IntToStr(ShExecInfo.hInstApp));
    end;
  end;
  CloseHandle(ShExecInfo.hProcess);
end;



Использовать Pipe и соответственно CreateProcess - не прокатило, так как совершенно непонятной мне причине в этом случае gbak не стартует где-то в 50% случаев, а иногда стартует, но не возвращает лог.
...
Рейтинг: 0 / 0
05.12.2019, 14:16
    #39898590
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
BorodaOleg,

автор
'Файл захвачен другим пользователем');

"всем оставаться на местах"

осторожнее... с такими сообщениями :)
...
Рейтинг: 0 / 0
05.12.2019, 14:17
    #39898591
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
решение - говно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 14:33
    #39898604
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Ну вот скажи - нахрена?
BorodaOleg
Код: pascal
1.
  ShExecInfo.lpFile := 'cmd.exe';

...
Рейтинг: 0 / 0
05.12.2019, 14:36
    #39898605
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
05.12.2019 14:33, ёёёёё пишет:
> Ну вот скажи - нахрена?

я скажу.
тупая копи-паста первого попавшегося примера.
90% кода в интернете -
говно!

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 14:45
    #39898612
BorodaOleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
sql2012
BorodaOleg,

автор'Файл захвачен другим пользователем');


"всем оставаться на местах"

осторожнее... с такими сообщениями :)


В описаловке так было, копировал не задумываясь
...
Рейтинг: 0 / 0
05.12.2019, 14:46
    #39898614
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
05.12.2019 14:45, BorodaOleg пишет:
> копировал не задумываясь

О!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 14:51
    #39898615
BorodaOleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Мимопроходящий

05.12.2019 14:33, ёёёёё пишет:
> Ну вот скажи - нахрена?

я скажу.
тупая копи-паста первого попавшегося примера.
90% кода в интернете -
говно!



Не знаю, меня удовлетворило.
CMD выводит лог опроса, по окончании обработки окно закрывается, визуально видно что копия создана.

А насчёт код - говно!
Если он работает, и работает так как нужно, то почему он говно? Потому что тебя не устраивает?
...
Рейтинг: 0 / 0
05.12.2019, 14:52
    #39898618
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
05.12.2019 14:51, BorodaOleg пишет:
> А насчёт код - говно!
> Если он работает, и работает так как нужно, то почему он говно? Потому что тебя не устраивает?

воняет же!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 14:52
    #39898620
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
BorodaOleg,

Есть множество граничных случаев. Как этот код поведет себя, если все эти случаи воспроизвести?
...
Рейтинг: 0 / 0
05.12.2019, 14:53
    #39898621
BorodaOleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Мимопроходящий

05.12.2019 14:45, BorodaOleg пишет:
> копировал не задумываясь

О!


Не вырывайте текст из контекста уважаемый
Там было сказано - копировал текст описания ошибки не задумываясь,
...
Рейтинг: 0 / 0
05.12.2019, 14:55
    #39898625
BorodaOleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
X-Cite
BorodaOleg,

Есть множество граничных случаев. Как этот код поведет себя, если все эти случаи воспроизвести?


Пока работает устойчиво, если полезут баги - буду думать что-то ещё.
...
Рейтинг: 0 / 0
05.12.2019, 14:57
    #39898628
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
05.12.2019 14:55, BorodaOleg пишет:
> Пока работает устойчиво, если полезут баги - буду думать что-то ещё.

не будешь.
будешь искать очередное говно-решение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 15:04
    #39898633
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
BorodaOleg
CMD выводит лог опроса, по окончании обработки окно закрывается, визуально видно что копия создана.


1. Что за "лог опроса"?
2. А без cmd.exe - "окно не закрывается", "визуально не видно"?
...
Рейтинг: 0 / 0
05.12.2019, 15:17
    #39898648
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Кстати, может кому интересно, написал процедурку для вызова из консольной программы другой консольной команды.
При этом вывод вызываемой команды идет в основную консоль.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
procedure ConsoleExecute(const CommandLine: String);
type TBuffer = array[0..511] of byte;
var SA: TSecurityAttributes;
    SI: TStartupInfo;
    PI: TProcessInformation;
    StdOutPipeRead, StdOutPipeWrite: THandle;
    Result: Boolean;
    Buffer: TBuffer;
    BytesRead: Cardinal;
    vCmd: String;
    S,S2: AnsiString;
begin
  SA.nLength := SizeOf(SA);
  SA.bInheritHandle := True;
  SA.lpSecurityDescriptor := nil;

  CreatePipe(StdOutPipeRead,StdOutPipeWrite, @SA, 0);
  try
    FillChar(SI, SizeOf(SI), 0);
    SI.cb := SizeOf(SI);
    SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    SI.wShowWindow := SW_HIDE;
    SI.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
    SI.hStdOutput := StdOutPipeWrite;
    SI.hStdError := StdOutPipeWrite;

    vCmd := CommandLine;
    Result := CreateProcess(nil, PWideChar(vCmd), nil, nil, True, 0, nil, nil, SI, PI);
    CloseHandle(StdOutPipeWrite);
    if not Result then raise Exception.Create('Could not execute command line');
    try
      repeat
        Result := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
        if BytesRead > 0 then
        begin
          SetLength(S,BytesRead);
          move(Buffer[0],S[Low(S)],BytesRead);
          S2 := S;
          OemToAnsi(PAnsiChar(S),PAnsiChar(S2));
          Write(S2);
        end;
      until not Result or (BytesRead = 0);
      WaitForSingleObject(PI.hProcess, INFINITE);
    finally
      CloseHandle(PI.hThread);
      CloseHandle(PI.hProcess);
    end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;
...
Рейтинг: 0 / 0
05.12.2019, 15:19
    #39898652
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
05.12.2019 15:17, Sinemurius пишет:
> вывод вызываемой команды идет в основную консоль.

зайчем? (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2019, 15:20
    #39898654
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecute: задержка выполнения программы до отработки внешней программы
Мимопроходящий
05.12.2019 15:17, Sinemurius пишет:
> вывод вызываемой команды идет в основную консоль.

зайчем? (С)

"Потому что могу!"
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ShellExecute: задержка выполнения программы до отработки внешней программы / 25 сообщений из 74, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]