Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение работы приложения 
V
    Опции темы
former
  Дата 11.12.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Есть два приложения, лежащие в одной директории. Необходимо при запуске второго проверять не запущено ли первое. Если запущено, то предложить пользователю его завершить. При отказе пользователя завершить второе.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
anwe
Дата 11.12.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Ищи по хэндлам окон.
PM MAIL   Вверх
Sunvas
Дата 11.12.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Это же просто!
Вот смотри:
Код для определения запущенности процесса:
Код

uses tlhelp32;
function IsRunning( sName : string ) : boolean;  
var  
  han : THandle;  
  ProcStruct : PROCESSENTRY32; // from "tlhelp32" in uses clause  
  sID : string;  
begin  
  Result := false;  
  // Get a snapshot of the system  
  han := CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );  
  if han = 0 then  
    exit;  
  // Loop thru the processes until we find it or hit the end  
  ProcStruct.dwSize := sizeof( PROCESSENTRY32 );  
  if Process32First( han, ProcStruct ) then  
    begin  
      repeat  
        sID := ExtractFileName( ProcStruct.szExeFile );  
        // Check only against the portion of the name supplied, ignoring case  
        if uppercase( copy( sId, 1, length( sName ) ) ) = uppercase( sName ) then  
          begin  
            // Report we found it  
            Result := true;  
            Break;  
          end;  
      until not Process32Next( han, ProcStruct );  
    end;  
  // clean-up  
  CloseHandle( han );  
end; 



Код убивания процесса:
Код

function KillTask(ExeFileName: string): integer;  
const  
  PROCESS_TERMINATE=$0001;  
var  
  ContinueLoop: BOOL;  
  FSnapshotHandle: THandle;  
  FProcessEntry32: TProcessEntry32;  
begin  
  result := 0;  

  FSnapshotHandle := CreateToolhelp32Snapshot  
                     (TH32CS_SNAPPROCESS, 0);  
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  
  ContinueLoop := Process32First(FSnapshotHandle,  
                                 FProcessEntry32);  

  while integer(ContinueLoop) <> 0 do  
  begin  
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  
         UpperCase(ExeFileName))  
     or (UpperCase(FProcessEntry32.szExeFile) =  
         UpperCase(ExeFileName))) then  
      Result := Integer(TerminateProcess(OpenProcess(  
                        PROCESS_TERMINATE, BOOL(0),  
                        FProcessEntry32.th32ProcessID), 0));  
    ContinueLoop := Process32Next(FSnapshotHandle,  
                                  FProcessEntry32);  
  end;  

  CloseHandle(FSnapshotHandle);  
end; 


И, соответственно проверяем (для примера на блокноте):
Код

Var ExB: WORD;
begin
if isrunning('notepad.exe') then
begin
ExB:=MessageBox(handle,pchar('Äðóãîé ïðîöåññ çàïóùåí! Óáèòü åãî?'),pchar('Âîïðîñ'),36);

if Exb=IDYES then
    killtask('notepad.exe');
if Exb=IDNO then
    application.Terminate;
end;



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Nicholas_S
Дата 11.12.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



former, если оба приложения НЕ консольные и убивать одно из них при запуске второго не требуется, то можно обойтись 10 строками кода и вежливо попросить второе приложение закрыться. Например:

Код

// файл .dpr

uses  Forms, Windows,  Messages... // добавляем 2 модуля Windows & Messages

var h: HWND;

begin
  Application.Initialize;

  // Пытаемся найти дескриптор окна второго приложения по имени класса.
  // В данном случае мы обозвали ту форму "TMyForm".
  h := FindWindow('TMyForm', nil);  

  // Если нашли окно, посылаем сообщение о закрытии
  if h>0 then
    SendMessage(h, WM_CLOSE, 0, 0);

  // Аналогичные действия для второго приложения, только заменив имя класса формы
...
end.



Добавлено @ 21:46 
И еще. Придется дождаться ответа от второго приложения (закрылось оно или нет, если это критично), но тут уже тема несколько другая, где-то обсуждалась вроде бы.


--------------------
...все в мире относительно
PM   Вверх
former
Дата 11.12.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Всем спасибо за помощь. 

Использовал код Sunvas. Всё работает так, как надо. Ставлю +.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.