убить винрар из делфи

  • Автор темы vs_delphi
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

vs_delphi

#1
помогите плс!!! очень срочно нужно!!!

есть winrar-sfx файл
1. в run before extraction есть маленькая делфийская программка, проверяет наличие файлов на диске, версию виндоуса и т.д.
2. потом работает сам эктрактор винрара
3. в run after extraction окончательная довода и запуск установленной задачи при наличии птицы в чекбоксе.
вопрос: можно ли убить винрар в п.1 по моему условию, например: по наличию файла на диске или не совместимости версии виндоуса.
т.е. не дать винрару вовсе запуститься по условию и разумеется в этом случае убить третий пункт.
собственно, если винрар будет убит, скорей всего п.3 не не будет запущен.
в раровских скриптах не нашел ничего для самоубийства

заранее сенкс!!!!

p.s.
delphi 7
winrar 3.51
 
Z

zubr

#2
Можно попробовать такой вариант:
1. Твоя программка определяет список процессов в системе.
2. Сопостовляет хэндлы процессов с именами исполняемого файла.
3. Когда находит хэндл процесса винрара делает ему TerminateProcess.
 
V

vs_delphi

#3
если есть маленький готовый пример поделись плс!!!
 
Z

zubr

#4
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Psapi;

type
TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
private
 { Private declarations }
public
 { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function WinNTProcess(put:string):boolean;
var 
PIDArray: array [0..1023] of DWORD; 
cb: DWORD; 
I: Integer; 
ProcCount: Integer; 
hMod: HMODULE; 
hProcess: THandle; 
ModuleName: array [0..300] of Char;
s:string;
begin
Result:=False; 
EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
ProcCount := cb div SizeOf(DWORD); 
for I := 0 to ProcCount - 1 do 
begin 
 hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PIDArray[I]);
 if (hProcess <> 0) then
 begin
 EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
 FillChar(ModuleName, 300, #0);
 GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
 s:=string(ModuleName);
 s:=ExtractFileName(s);
 If CompareText(s, put)=0 then
 begin
  TerminateProcess(hProcess, 0);
  Result:=True;
  ShowMessage('WinRar terminated');
  exit;
 end;
 CloseHandle(hProcess);
 end;
end; 
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
If WinNTProcess('Project1.sfx.exe') then
Application.Terminate;
end;

end.
З.Ы. Только для NT-систем.
 
P

Poseidon

#5
Код:
uses 
Tlhelp32, Windows, SysUtils; 

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;
В ExeFileName передаешь имя твоего файла-архива (что бы закрыть именно его).
 
Статус
Закрыто для дальнейших ответов.