Autor Téma:  (Přečteno 1312 krát)

Lord_Lojza

  • Host
(Bez předmětu)
« kdy: 11-06-2007, 22:08:00 »
Dobrý den

potřeboval bych radu, jak z jedne aplikace zavřít jinou aplikaci ( obě aplikace mnou vytvořené )

--
Tvorba databázových aplikací http://losa.cz

vrtulex (Martin Dráb)

  • Host
(Bez předmětu)
« Odpověď #1 kdy: 11-06-2007, 23:08:59 »
Je několik možností:

+ Najít si okno cílové aplikace přes FindWindow (podle titulku třeba) a poslat mu nějakou zprávu (WM_QUIT, WM_CLOSE). Možná by na to okno šla aplikovat i procedura EndTask
+ Pomocí CreateToolHelp32Snapshot/Process32First/Next si najít všechny procesy a to .EXE ukončit přes OpenProcess/TerminateProcess - to je ale dost drsné... aplikace nemá šanci na žádnou reakci
+ Vytvořit v cílové aplikaci vlákno, které vykoná ExitProcess (pro fajnšmekry)

Ale myslím, že není dobré řešení ukončovat nějakou tvoji naprogramovanou aplikaci takhle násilně... je lepší, když ona sama pozná, kdy má skončit a skončí

Martin Dráb
http://www.vrtulex.net
http://www.jadro-windows.cz

Datel_new

  • Host
(Bez předmětu)
« Odpověď #2 kdy: 11-06-2007, 23:30:00 »
...nebo můžeš té svojí aplikaci poslat zprávu WM_COPYDATA

Lord_Lojza

  • Host
(Bez předmětu)
« Odpověď #3 kdy: 12-06-2007, 00:44:00 »
jo mate naprostou pravdu drasticke ukonceni neni asi to prave ... zkusim radu poslat zprávu WM_COPYDATA. Diky za nazory, pokud sem budete chtit hodit vysledek , staci rict ...

--
Tvorba databázových aplikací http://losa.cz

snop

  • Host
(Bez předmětu)
« Odpověď #4 kdy: 12-06-2007, 01:29:00 »
proc WM_COPYDATA ?  ??? ???

sNop

Lord_Lojza

  • Host
(Bez předmětu)
« Odpověď #5 kdy: 12-06-2007, 03:24:00 »
a co by jsi použil ty pro předavani dat mezi aplikacemi ?

--
Tvorba databázových aplikací http://losa.cz

vrtulex (Martin Dráb)

  • Host
(Bez předmětu)
« Odpověď #6 kdy: 12-06-2007, 11:11:00 »
Lord_Lojza Napsal:
-------------------------------------------------------
> a co by jsi použil ty pro předavani dat mezi
> aplikacemi ?

Já k tomu využívám eventy a namapované soubory

Martin Dráb
http://www.vrtulex.net
http://www.jadro-windows.cz

JaroB

  • Host
(Bez předmětu)
« Odpověď #7 kdy: 12-06-2007, 11:27:00 »
A jak zavřít aplikaci, u které znám jenom název programu XYZ.exe, jak to udělat?

Jaro B.

JaroB

  • Host
(Bez předmětu)
« Odpověď #8 kdy: 12-06-2007, 11:49:00 »
Mohlo by to být třeba takhle?

Kód: [Vybrat]
uses TlHelp32;

function KillTaskByExeName(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;


Jaro B.

snop

  • Host
(Bez předmětu)
« Odpověď #9 kdy: 12-06-2007, 12:50:00 »
j...pokud aplikace nema okno tak muzes pouzit i event, ale nevim nac ji budes posilat WM_COPYDATA a zbytecne vyplnovat rekord TCopyDataStruct, kdyz ti staci poslat message WM_USER. Nepotrebujes posilt kopu dat nato aby druha aplikace vedela ze se ma zavrit, ale staci ti poslat jedno cislo, ktere predas cez wParam alebo lParam, na zaklade ktereho druha aplikace prevede Aplication.Terminate.

sNop