Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запуск внешнего приложение и ожидание его завершения / 14 сообщений из 14, страница 1 из 1
22.09.2020, 08:21
    #40001167
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
под win7 32 все работает, под win7 64
получаю

Cannot open file .......... Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

кусок программы (Delphi 7)для запуска используется ShellExecAndWait из JEDI
вот ее код

Код: 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.
function ShellExecAndWait(const FileName: string; const Parameters: string;
  const Verb: string; CmdShow: Integer; const Directory: string): Boolean;
var
  Sei: TShellExecuteInfo;
  Res: LongBool;
  Msg: tagMSG;
begin
  ResetMemory(Sei, SizeOf(Sei));
  Sei.cbSize := SizeOf(Sei);
  Sei.fMask := SEE_MASK_DOENVSUBST  or SEE_MASK_FLAG_NO_UI  or SEE_MASK_NOCLOSEPROCESS or
    SEE_MASK_FLAG_DDEWAIT;
  Sei.lpFile := PChar(FileName);
  Sei.lpParameters := PCharOrNil(Parameters);
  Sei.lpVerb := PCharOrNil(Verb);
  Sei.nShow := CmdShow;
  Sei.lpDirectory := PCharOrNil(Directory);
  {$TYPEDADDRESS ON}
  Result := ShellExecuteEx(@Sei);
  {$IFNDEF TYPEDADDRESS_ON}
  {$TYPEDADDRESS OFF}
  {$ENDIF ~TYPEDADDRESS_ON}
  if Result then
  begin
    WaitForInputIdle(Sei.hProcess, INFINITE);
    while WaitForSingleObject(Sei.hProcess, 10) = WAIT_TIMEOUT do
      repeat
        Msg.hwnd := 0;
        Res := PeekMessage(Msg, Sei.Wnd, 0, 0, PM_REMOVE);
        if Res then
        begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;
      until not Res;
    CloseHandle(Sei.hProcess);
  end;
end;



вот код запуска
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TDFMEditFrame.EditDescription;
var TempFileName : TFileName;
begin
  TempFileName := PathGetTempPath + 'AbMenuEdt.rtf';
  DescriptionEdit.Lines.SaveToFile(TempFileName);
  ShellExecAndWait(TempFileName,'','',SW_MAXIMIZE);
  Resource.DataSet.Edit;
  DescriptionEdit.Lines.LoadFromFile(TempFileName);
  Resource.DataSet.Post;
end;




может есть какие мысли по этому поводу
зы. в делфи не силен, да и в винде тоже
...
Рейтинг: 0 / 0
22.09.2020, 11:32
    #40001225
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
m7m
Cannot open file .......... Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

Может, посмотреть - кем же занят файл?
...
Рейтинг: 0 / 0
22.09.2020, 11:53
    #40001232
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
m7m
в делфи не силен, да и в винде тоже
где ты взял эту портянку?
верни обратно.

зы: весь код в инторнете - говно! (С)
...
Рейтинг: 0 / 0
22.09.2020, 12:25
    #40001245
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
>m7m, сегодня, 08:21 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1329311&msg=22201672][22201672]
>может есть какие мысли по этому поводу
<
посмотри здесь .
...
Рейтинг: 0 / 0
22.09.2020, 12:36
    #40001247
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
22.09.2020 12:25, ВМоисеев пишет:
> посмотри здесь < http://www.delphirus.com/article32.html>.

там насрано
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.09.2020, 12:50
    #40001253
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
Попробуйте такой вариант (не помню, откуда брал, но вроде работало):

Код: 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.
function ExecProcessAndWait(const Cmd: String): Integer;
  procedure ChkBool(Value: Boolean; const Msg: String);
  begin
    if not Value then
      raise exception.create(Msg);
  end;
var
  ProcessInfo: TProcessInformation;
  hProcess   : THandle;
  ReturnCode : Integer;
  StartupInfo: TStartupInfo;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  ChkBool(CreateProcess(nil, PChar(Cmd), nil, nil, False,
	  CREATE_DEFAULT_ERROR_MODE + NORMAL_PRIORITY_CLASS,
	  NIL, NIL, StartupInfo, ProcessInfo),
	  'Error during CreateProcess');
  hProcess := ProcessInfo.hProcess; // save the process handle
  //Close the thread handle as soon as it is no longer needed
  CloseHandle(ProcessInfo.hThread);
  ReturnCode := WaitForSingleObject(hProcess, INFINITE);
  ChkBool(dword(ReturnCode) <> WAIT_FAILED, 'Error in WaitForSingleObject');
  // The process terminated
  ChkBool(GetExitCodeProcess(hProcess, dword(Result)),
	  'Error in GetExitCodeProcess');
  // Close the process handle as soon as it is no longer needed
  ChkBool(CloseHandle(hProcess),
	  'Error in process Close Handle');
end;


...
Рейтинг: 0 / 0
22.09.2020, 13:01
    #40001260
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
CreateProcess <> ShellExecute

Ну и так, в общем случае, нельзя:

CreateProcess(nil, PChar(Cmd), ...
...
Рейтинг: 0 / 0
22.09.2020, 13:02
    #40001262
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
22.09.2020 13:01, Maxim Rusov пишет:
> CreateProcess <> ShellExecute

глубоко!

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.09.2020, 13:17
    #40001270
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
Дайте хоть контекст.

Кто запускается?
Вы уверены, что то, что вы запускаете, не отдаёт файл на открытие в первую запущенную копию, а само сразу закрывается?
Кто именно показывает "не могу открыть файл"?
Если ваша программа - в каком месте/строке?
Или, может, вообще не ваша?
Кто именно держит файл (проверяется Process Explorer или другими программами )?
...
Рейтинг: 0 / 0
22.09.2020, 13:33
    #40001277
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
m7mCannot open file .......... Процесс не может получить доступ к файлу, так как этот файл
занят другим процессом.

Устанавливай SHARE_* флаги чтобы можно было открывать файл пока он открыт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.09.2020, 14:11
    #40001303
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
Всем спасибо!!!

Кардинально проблема не решилась, однако нашел причину разного поведения
программы под win7 32 и win7 64
В моем случае все банально просто
для .rtf файлов в win7 32 запускался WordPad
а в в win7 64 запускался LibreOffice

заменил ассоциацию для .rtf в win7 64 на WordPad
и все заработало

Пока для меня этого достаточно ибо в данном случае
оно кроме как мне больше никому не нужно
...
Рейтинг: 0 / 0
22.09.2020, 14:13
    #40001304
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
22.09.2020 14:11, m7m пишет:
> заменил ассоциацию

о хоспаде!..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.09.2020, 14:29
    #40001314
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
m7m
заменил ассоциацию для .rtf в win7 64 на WordPad
и все заработало
Изначально было понятно, что ошибка в делфи этом :)
...
Рейтинг: 0 / 0
23.09.2020, 11:37
    #40001578
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск внешнего приложение и ожидание его завершения
к слову, удобная и надежная функция в jcl (WinExec32AndWait):

https://github.com/project-jedi/jcl/blob/bde454905aac7f961350e5c36af5ad0a4713963b/jcl/source/windows/JclMiscel.pas#L207
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запуск внешнего приложение и ожидание его завершения / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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