Есть однопоточное приложение-работник — оно запускается с аргументами в командной строке и складывает результаты работы в указанную папку. Также есть приложение-менеджер, оно запускает несколько работников (для использования многопоточности) и в отдельном потоке просматривает папки с результатами их работы.
С запуском приложения-работника проблем нет (использую CreateProcess ). Как приложением-менеджером «убить» приложение-работника? Другими словами — как из Delphi запустить другое приложение, и в одностороннем порядке его «убить» или приказать ему закрыться? P.S. Оба приложения написаны мной. Убийство по имени процесса не подойдет, т.к. у всех работников имя одинаковое.
Отслеживать
задан 18 июл 2018 в 5:39
13.6k 12 12 золотых знаков 43 43 серебряных знака 72 72 бронзовых знака
По-моему, именно «убивать» процесс — плохая идея. Раз оба процесса написаны вами, то лучше организуйте обмен сообщениями между ними (через windows messages, shared memory, pipes, tcp и т.д) и из главного приложения приказывайте дочернему завершиться. И уже в крайнем случае, когда дочернее вдруг откажется реагировать на команды, используйте TerminateProcess.
Основы Delphi 7 и своя первая программа!! Учимся программировать!!
18 июл 2018 в 6:20
18 июл 2018 в 6:25
приложение-работник это консольное приложение или оконное?
18 июл 2018 в 7:05
18 июл 2018 в 7:06
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Вариант с чистым убийством через TerminateProcess:
Как писали выше это не очень хороший вариант, но может вам больше и не надо, поэтому привожу пример.
program KillTest; uses System.SysUtils, System.SyncObjs, WinApi.Windows; procedure DoWork(); begin Writeln(‘Worker’); while True do begin Sleep(500); end; end; procedure CreateWaitKillWorker(const ExeName: String); var Si: TStartupInfo; Pi: TProcessInformation; CommandLine: String; begin Writeln(‘Manager’); CommandLine := ExeName + ‘ -C’; Si := Default(TStartupInfo); Si.cb := sizeof(si); if CreateProcess(nil, PChar(CommandLine), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, Si, Pi) then begin try Sleep(5000); TerminateProcess(Pi.hProcess, 0); finally CloseHandle(Pi.hProcess); CloseHandle(Pi.hThread); end; end; Readln; end; var ChildProcExeName: String; begin try ChildProcExeName := ParamStr(0); if ParamCount > 0 then DoWork() else CreateWaitKillWorker(ChildProcExeName); except on E: Exception do Writeln(E.ClassName, ‘: ‘, E.Message); end; end.
Вариант с вежливым убийством через TEvent:
Это вариант лучше если вам нужно закрыть дочерний процесс более аккуратно.
program KillTest; uses System.SysUtils, System.SyncObjs, WinApi.Windows; procedure DoWork(); var Event: TEvent; begin Writeln(‘Worker’); Event := TEvent.Create(nil, True, False, ‘Test’); try while Event.WaitFor(0) = TWaitResult.wrTimeout do begin Sleep(2000); end; finally Event.Free; end; end; procedure CreateWaitKillWorker(const ExeName: String); var Si: TStartupInfo; Pi: TProcessInformation; CommandLine: String; Event: TEvent; begin Writeln(‘Manager’); CommandLine := ExeName + ‘ -C’; Si := Default(TStartupInfo); Si.cb := sizeof(si); Event := TEvent.Create(nil, True, False, ‘Test’); try if CreateProcess(nil, PChar(CommandLine), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, Si, Pi) then begin try Sleep(5000); Event.SetEvent(); //WaitForSingleObject(Pi.hProcess, INFINITE); // если не обходимо ждать finally CloseHandle(Pi.hProcess); CloseHandle(Pi.hThread); end; end; finally Event.Free; end; Readln; end; var ChildProcExeName: String; begin try ChildProcExeName := ParamStr(0); if ParamCount > 0 then DoWork() else CreateWaitKillWorker(ChildProcExeName); except on E: Exception do Writeln(E.ClassName, ‘: ‘, E.Message); end; end.
PS: Примеры в консоли, но ни что не мешает их использовать в оконом приложении, правда для окон я предпочел бы вариант который описал kot-da-vinci
Delphi 7 [Урок #0] — Где Скачать и Как Установить
Источник: ru.stackoverflow.com
Как запустить программу в delphi 7
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
Directory: PChar; ShowCmd: Integer): HINST;
procedure TForm1.Button7Click(Sender: TObject); begin ShellExecute (0, //Хендл родительского окна », //Операция (open,print,explore) — по дефалту open ‘cmd.exe’, //Путь к файлу ‘ exit’, //Командная строка ‘%tmp%’, //Текущай каталог (для запускаемого приложения) SW_Show //Состояние показа окна (SW_Hide — скрыто, SW_Show — нормально, есть ещё несколько. ) ); end;
Редкий тунеядец
Форумчанин
Регистрация: 29.10.2006
Сообщений: 595
на начальном этапа проще применять:
function WindExec(CmdLine: PChar; CmdShow: Word): Word; procedure TForm1.Button7Click(Sender: TObject); begin winexec( ‘calc.exe’, //Путь к файлу SW_Show); //Тип показа end;
Для применения обейх функций подключи модуль ShellApi
Последний раз редактировалось Alex11223; 02.11.2016 в 17:32 .
Форумчанин
Регистрация: 11.10.2007
Сообщений: 384
Если надо засунуть exe или другой какой либо файл из приложения !
надо вставить его в ресурс и
откомпилить компилятором ресурсов. Далее читать из ресурса своего EXE-файла.
Как это зделать:
Пример:
Создать с помощью блокнота Файл обозвать его Program.rc
Пишем в него Program exe C:Program.exe и сохраняем его!
Далие открываем «C:Program FilesBorlandDelphibin»
и находим там файл brcc32.exe капируем в папку с Program.rc!
Создаём Program.bat открываем с помощю текст редактора пишем :
brcc32.exe Program.rc И сахраняем!
Program.exe должна нахадитс в ириктории C:Program.exe для избежании ошибки в пути!
Запускаем Program.bat получаем Program.RES .
Далие В проэкте пишем:
Если прсто запустить и падаждать завершения Program.exe
procedure TForm1.Button1Click(Sender: TObject); var si : Tstartupinfo; p : Tprocessinformation; begin FillChar( Si, SizeOf( Si ) , 0 ); with Si do begin cb := SizeOf( Si); dwFlags := startf_UseShowWindow; wShowWindow := 4; end; Application.Minimize; Createprocess(nil,’/Program.exe’,nil,nil,false,Create_d efault_error_mode,nil,nil,si,p); Waitforsingleobject(p.hProcess,infi nite); Application.Restore; end; |
Вобщем диржи полный димострационный код и пример с исходникам.
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,ShellAPI;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;
var
Form1: TForm1;
Продолжение ниже.
Вложения
Пример.rar (823.4 Кб, 283 просмотров) |
Источник: www.programmersforum.ru
Как запустить программу в delphi 7
Уважаемые пользователи nowa.cc и 2baksa.ws . У нас сложилось тяжёлое финансовое положение. Мы работаем для вас вот уже более 15 лет и сейчас вынуждены просить о помощи. Окажите посильную поддержку проектам. Мы очень надеемся на вас. Реквизиты для переводов ниже.
WMZ: 826074280762 WME: 804621616710
4100117770549562
Пользователь
Регистрация: 06.02.2006
Сообщений: 93
Репутация: 156
Delphi7 запуск программ из своего приложения.
1. Делаю для себя (для более удобной работы)
Есть программа в ней хочу сделать панель для запуска приложений реализую метод через ShellExecute (прописываю либо прямой путь к файлу либо стандартный путь к ярлыку в меню пуск)
путь к ярлыку
ShellExecute(0, nil, ‘C:Documents and SettingsAll UsersГлавное менюПрограммыCorelDRAW Graphics Suite 12CorelDRAW 12’,
nil, nil, SW_SHOWNORMAL);
прямой путь
ShellExecute(0, nil, ‘C:Program FilesThe Bat!thebat.exe’,
nil, nil, SW_SHOWNORMAL);
2. Задача.
Шаг 1й Создать файл настроек (например ini) где будет 2 раздела
пример
[Command] (тут е нас будут содержаться строка к исполняемому файлу)
[Image] (а тут у нас будет путь к определенной bmpшке для программы)
соответтсвенно нумаряция строк будет учитываться относительно заголоква.
Шаг 2й Программно добавляем новый ярлык на панель быстрого доступа.
Шаг 3й Программа сама определяет кол-во строк в файле насроек (10 например) и создает именно такое же кол-во кнопок для запуска необходимых преложений.
(DelphiWorld непредлагать узать читал без толку).
Шаг 4й. на.р.на это все надо сам непойму тык как софт ставлю всегда в определенную папку, думаю просто захотелось гемороя.
Недопетриваю:
Как сказать программе что при прочтении кол-ва строк в файле создать именно такое же кол-во кнопок. (вообще реально ли, но думаю что да просто недопонимаю)
Добавлено через 8 минут
Ах да чуть незабыл почему захотелось гемороя:
Просто иногда попадаються разные версии програмного обеспечения и соответственно непрокатит не один из методов.
простой пример для запуска Adobe Reader 6.0 необходима прямая строка C:Program FilesAdobeAcrobat 6.0 CEReader, а для 7.0 C:Program FilesAdobeAcrobat 7.0 CEReader. т.е. Пути к испольняемому файлу несоответствуют, а раздувать код программы прописывая несколько путей я думаю смысла неимеет. Хотя исследования подтвердили что при описании нескольких путей к одному програмному продукту, запускаеться та версия которая была найдена. Но лишний код, лишнее время на обработку (Хотя какое лишнее время на Pentiumax D и их последующих собратьях).
Последний раз редактировалось Skazi; 21.06.2007 в 11:21 .. Причина: Добавлено сообщение
Источник: nowa.cc