powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ShellExecute: задержка выполнения программы до отработки внешней программы
25 сообщений из 74, страница 1 из 3
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898452
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 к нему обратится...
Может кто что подскажет?
...
Рейтинг: 0 / 0
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898454
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898461
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему именно ShellExecute?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898463
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOleg
Может кто что подскажет?

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

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

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

И это получается гораздо быстрее. Хотя, конечно, в нынешней кривоватой реализации
локальный файл бэкапа и -v несовместимы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898580
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898587
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за помощь. 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
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898590
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorodaOleg,

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

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

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

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

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

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

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


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

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


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

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

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

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



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

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

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

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

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

О!


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

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


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

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


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

Код: 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
ShellExecute: задержка выполнения программы до отработки внешней программы
    #39898652
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.12.2019 15:17, Sinemurius пишет:
> вывод вызываемой команды идет в основную консоль.

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

зайчем? (С)

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


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