|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как запустить приложение из программы и не зависить от него
Запускаю exe-файл из программы:
ShellExecute(0, nil, filename, nil, nil, SW_SHOW); Exe-шник запускается, работает, все OK. Но когда в Exe-шник выскакивает диалоговое окно с "предупреждением", то я теряю доступ к своей программе, пока не закрою это диалоговое окно. Как сделать так что-бы программа и Exe-шник не имели ничего общего? |
#2
|
|||
|
|||
странно, как раз ShellExecute после старта процесса возвращает управление. как раз обычно что бы основная программа ждала завершения дочернего процесса и приходится изобретать разные механизмы (да, именно изобретать, т.к. комбинация флагов createProcess уникальна для каждого типа дочернего процсса).
Что за диалог-то? Может системный? |
#3
|
|||
|
|||
"Диалоговое окно с предупреждением" : class #32770 (Dialog)
При этом, доступ к другим программам не блокируется, только к основной программе, которая запустила exe-шник |
#4
|
|||
|
|||
может поскажите, каким механизмом попробовать запустить exe-шник?
|
#5
|
|||
|
|||
Запускаю exe-шник через CreateProcess
CreateProcess(filename, nil, nil, nil, False, CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, nil, nil, SUInfo, ProcInfo); все равно тоже самое. Может подкажите необходимые параметры для CreateProcess что-бы родительская программа не зависила от запускаемого процесса |
#6
|
||||
|
||||
попробуй создать cmd-файл, записать в нем запуск твоей второй программы и запускать уже только этот cmd-файл
|
#7
|
|||
|
|||
пробовал запускать exe-шник через bat-файл, все равно не помогло (странно).
Другие программы при этом работают как обычно. |
#8
|
||||
|
||||
winexec
|
#9
|
|||
|
|||
winexec - тоже самое
|
#10
|
||||
|
||||
может стоит вырезать из целого проекта "этот глючный кусок" и выложить здесь? чтобы можно было всем откомпилировать и увидеть эту бяку.
|
#11
|
|||
|
|||
У тя случаем не Vista или 7?
Тогда это никак не лечится. Подозреваю, это UAC вылезает. Только подписывать программу, а это дорого... |
#12
|
|||
|
|||
Цитата:
Код:
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
|
||||
|
||||
Что значит:
Код:
CreateProcess(nil, @App[1], nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, PMSI, PMPI); Код:
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
|
|||
|
|||
Цитата:
Код:
Пол-дня бьюсь как об стену и так: 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
|
|||
|
|||
Цитата:
Код:
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; в 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. |