Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.09.2010, 18:49
zhen73 zhen73 вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 6
Репутация: 10
По умолчанию Как запустить приложение из программы и не зависить от него

Запускаю exe-файл из программы:

ShellExecute(0, nil, filename, nil, nil, SW_SHOW);

Exe-шник запускается, работает, все OK. Но когда в Exe-шник выскакивает диалоговое окно с "предупреждением", то я теряю доступ к своей программе, пока не закрою это диалоговое окно.

Как сделать так что-бы программа и Exe-шник не имели ничего общего?
Ответить с цитированием
  #2  
Старый 04.09.2010, 06:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

странно, как раз ShellExecute после старта процесса возвращает управление. как раз обычно что бы основная программа ждала завершения дочернего процесса и приходится изобретать разные механизмы (да, именно изобретать, т.к. комбинация флагов createProcess уникальна для каждого типа дочернего процсса).
Что за диалог-то? Может системный?
Ответить с цитированием
  #3  
Старый 06.09.2010, 10:58
zhen73 zhen73 вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 6
Репутация: 10
По умолчанию

"Диалоговое окно с предупреждением" : class #32770 (Dialog)
При этом, доступ к другим программам не блокируется, только к основной программе, которая запустила exe-шник
Ответить с цитированием
  #4  
Старый 06.09.2010, 11:02
zhen73 zhen73 вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 6
Репутация: 10
По умолчанию

может поскажите, каким механизмом попробовать запустить exe-шник?
Ответить с цитированием
  #5  
Старый 06.09.2010, 14:20
zhen73 zhen73 вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 6
Репутация: 10
По умолчанию

Запускаю exe-шник через CreateProcess

CreateProcess(filename, nil, nil, nil, False,
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS,
nil, nil, SUInfo, ProcInfo);

все равно тоже самое.

Может подкажите необходимые параметры для CreateProcess что-бы родительская программа не зависила от запускаемого процесса
Ответить с цитированием
  #6  
Старый 06.09.2010, 14:47
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

попробуй создать cmd-файл, записать в нем запуск твоей второй программы и запускать уже только этот cmd-файл
Ответить с цитированием
  #7  
Старый 06.09.2010, 14:54
zhen73 zhen73 вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 6
Репутация: 10
По умолчанию

пробовал запускать exe-шник через bat-файл, все равно не помогло (странно).
Другие программы при этом работают как обычно.
Ответить с цитированием
  #8  
Старый 06.09.2010, 15:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

winexec
Ответить с цитированием
  #9  
Старый 06.09.2010, 16:03
zhen73 zhen73 вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 6
Репутация: 10
По умолчанию

winexec - тоже самое
Ответить с цитированием
  #10  
Старый 06.09.2010, 16:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

может стоит вырезать из целого проекта "этот глючный кусок" и выложить здесь? чтобы можно было всем откомпилировать и увидеть эту бяку.
Ответить с цитированием
  #11  
Старый 06.09.2010, 18:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

У тя случаем не Vista или 7?
Тогда это никак не лечится. Подозреваю, это UAC вылезает. Только подписывать программу, а это дорого...
Ответить с цитированием
  #12  
Старый 04.12.2010, 23:24
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
Вопрос

Цитата:
Сообщение от zhen73
Запускаю exe-шник через CreateProcess

CreateProcess(filename, nil, nil, nil, False,
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS,
nil, nil, SUInfo, ProcInfo);
Пол-дня бьюсь как об стену, дошёл до:
Код:
procedure Run(App: String);
var
  ErrStr : String;
  PMSI: TStartupInfo;
  PMPI: TProcessInformation;
begin
try
  CreateProcess(nil, @App[1], nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, PMSI, PMPI);
except
  ErrStr := 'Fault run process: '''+App+'''';
  Application.MessageBox(@ErrStr[1],'Failure process',MB_OK+MB_ICONERROR);
end;
end;
Вызываю:
s:=ExtractFilePath(Application.ExeName) + 'winamp\winamp.exe';
run (s);
а в ответ - тишина.... всмысле: не могу запустить процесс winamp.exe. Что не так? - Не понимэ, хэлп ми плыз (хильфен мир битте)

P.S. A Delphi7 нормально эту функцию обрабатывает (или мож в Uses чо добавить?)

Последний раз редактировалось Admin, 05.12.2010 в 14:03.
Ответить с цитированием
  #13  
Старый 04.12.2010, 23:34
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Что значит:
Код:
CreateProcess(nil, @App[1], nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, PMSI, PMPI);
Ты должен передать полный путь к нужному файлу а не 1 символ. Вот нужная тебе функция:
Код:
function CreateProcessSimple(sExecutableFilePath: string ): string;
var
  pi: TProcessInformation;
  si: TStartupInfo;
begin
  FillMemory(@si, sizeof(si), 0);
  si.cb := sizeof(si);

  CreateProcess(
    nil,
    PChar( sExecutableFilePath ),  // путь к исполняемому файлу:
    nil, nil, False,
    NORMAL_PRIORITY_CLASS, nil, nil,
    si, pi
  );

  // После вызывающего кода,
  // как код ожидания выполнения процесса,
  // Вы должны идти сюда

  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;

//и запуск:
CreateProcessSimple('C:\1.exe');
__________________
Помогаю за Спасибо
Ответить с цитированием
  #14  
Старый 04.12.2010, 23:54
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
Вопрос

Цитата:
Сообщение от zhen73
Запускаю exe-шник через CreateProcess
Код:
       CreateProcess(filename, nil, nil, nil, False,
       CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS,
       nil, nil, SUInfo, ProcInfo);
Код:
Пол-дня бьюсь как об стену и так:
  s:=ExtractFilePath(Application.ExeName);
  StrPcopy(wamp, s);
  strcat(wamp, pchar('winamp\winamp.exe'));
  CreateProcess(wamp,nil,nil,nil,false,CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS,nil,nil,si,pi);
и так:
procedure Run(App: String);
var
  ErrStr : String;
  PMSI: TStartupInfo;
  PMPI: TProcessInformation;
begin
try
  CreateProcess(nil, @App[1], nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, PMSI, PMPI);
except
  ErrStr := 'Fault run process: '''+App+'''';
  Application.MessageBox(@ErrStr[1],'Fault process',MB_OK+MB_ICONERROR);
end;
end;

вызов:
s:=ExtractFilePath(Application.ExeName) + 'winamp\winamp.exe';
run (s);
а в ответ тишина ... и от одной и от другой кнопки - что не так? И вообще: как это у людей работает?

Последний раз редактировалось Admin, 05.12.2010 в 14:04.
Ответить с цитированием
  #15  
Старый 05.12.2010, 00:42
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
Вопрос

Цитата:
Сообщение от v1s2222
Ты должен передать полный путь к нужному файлу а не 1 символ. Вот нужная тебе функция:
Большое тебе человеческое Зер Гроссе Данке Щён, мил человек - заработало, но... Своей цели я всё-таки не добился, а трабла в следующем:
Код:
procedure TForm1.PlayAllClick(Sender: TObject);
var
s, exe: string;
begin
  s:=ExtractFilePath(Application.ExeName);
  exe:=s + 'winamp\winamp.exe';
  tmp:= artist+ ArtistBox1.Items[ArtistBox1.ItemIndex] + '\';
  s:=s + tmp +  'all.m3u';
  If FileExists (tmp + 'all.m3u') Then
  CreateProcessSimple (exe, s)
  //WinShellExecute ('', tmp + 'all.m3u')
  else showmessage ('Архивариус не может открыть файл: '+tmp + 'all.m3u');
  memo2.Lines.Add(s);
end;
Admin: Пользуемся тегами для оформления кода!

в CreateProcessSimple - изменения: в декларации ..., s:...и в теле:
... CreateProcess(PChar( sExecutableFilePath ), // путь к исполняемому файлу:
PChar(s), nil, nil, False,NORMAL_PRIORITY_CLASS, nil, nil,si, pi);....
к сожалению s одинаково коряво передаёт винампу путь к плэйлисту как WinExec-у и ShellExecut-у, так и в данном случае. Так что спасибо за помощь, но воз и ныне там - придётся изобретать другой лисапед.
P.S. А случаем ни у кого нет познаний пообширней вэтом направлении?

Последний раз редактировалось Admin, 05.12.2010 в 14:05.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter