Hogyan programozható le egy másik alkalmazás

Az alkalmazás finoman bezárásához és a tisztításhoz a WM_CLOSE üzenetet kell elküldeni az alkalmazásban lévő összes látható felső szintű ablaknak. A WM_CLOSE üzenet elküldése megegyezik az ablak rendszer menüjének Bezárás parancsával. Ha az alkalmazás helyesen van írva, felszabadítja az erőforrásokat, és befejezheti. Fel kell készülnünk arra, hogy a befejezési folyamat késleltethető. Például egy alkalmazás megkérheti a felhasználót, hogy el kívánja-e menteni a módosított fájlokat. Ha az alkalmazás nem ér véget ésszerű időn belül, akkor csak a "nehéz tüzérség" - a TerminateProcess funkció alkalmazására lesz szükségünk.

A várakozás szervezésében a maximális rugalmasság érdekében elhatároztuk, hogy a funkciót a következő prototípus szerint állítjuk le.

Az hWnd paraméter azonosítja az alkalmazást, amelyet meg akarunk szüntetni, lehet, hogy az alkalmazás által használt bármelyik ablak. A pfnWaitCallback paraméter egy felhasználó által definiált függvényt határoz meg, amelyet rendszeresen hívnak a várakozás alatt. A program ezt a funkciót használhatja az üzenetek feldolgozásához, miközben a függvény vár a folyamat befejezésére. Ezenkívül a felhasználó által definiált függvény határozza meg, mikor elegendő várni, és itt az ideje, hogy alkalmazza a nyers erő alkalmazását: a függvény visszatérési értéke határozza meg a KillApplication további viselkedését.

Végezze el a folyamatot a TerminateProcess segítségével

Először is a függvény határozza meg a folyamat és az áramlás azonosítókat, amelyekhez a megadott ablak tartozik - később ezeket használjuk fel a leállítandó alkalmazás azonosítására. A függvény ezután ellenőrzi, hogy a megadott ablak a Windows NT 16 bites feladatához tartozik-e. A 16 bites feladatok speciális feldolgozást igényelnek, és ezeket külön is megvizsgáljuk.

A 32 bites esetben a függvény megnyitja a folyamatkezelőt a SYNCHRONIZE és a PROCESS_TERMINATE hozzáférési jogosultságokkal. Ha nem rendelkezünk ilyen jogokkal a lezárandó eljárással kapcsolatban, a függvény azonnal hibával zárul. Ezután a függvény elküldi a WM_CLOSE üzenetet minden, a folyamathoz tartozó legfelső szintű ablaknak, amelyhez az EnumWindows programot használjuk. megadva a KillAppEnumWindow-t felsorolási függvényként. amelynek szövegét az alábbiakban adjuk meg.

Az üzenetek elküldése után a funkció a várakozó hurokba kerül. Minden 100 milliszekundumban egy felhasználó által definiált függvényt hív fel, amely képes felhalmozódott üzenetek feldolgozására és eldönteni, hogy várjon-e. Ki ciklus fordul történik, ha a következő két esemény: a folyamat befejeződik, és visszatér WaitForSingleObject WAIT_OBJECT_0, vagy felhasználó által definiált függvény visszatérési értéke eltér KILLAPP_WAIT. Ha a felhasználó által definiált függvény visszatérési értéke KILLAPP_TERMINATE volt, akkor a folyamat befejeződik a TerminateProcess programmal.

Mint már említettük, a 16 bites feladatokat speciális módon kezeljük. A 32 bites feladatok fő különbsége számunkra, hogy több 16 bites feladat is megoszthatja egy WOW VDM folyamatot, így a 32 bites alkalmazások befejezéséhez használt logika nem megfelelő. Először is itt van az IsWOWProcess funkció kódja. amelyet a 16 bites feladatok megkülönböztetésére használnak:

Az IsWOWProcess felsorolja az összes virtuális WAN DOS gépet a VDMDBG.DLL VDMEnumProcessWOW függvényével. Ha az ablak KillApplication paraméterként van megadva. az egyik ilyen folyamat része, ezért egy 16 bites feladattal foglalkozunk.

A 16 bites célokat, mi is küldünk WM_CLOSE üzenet minden felső szintű ablak ezt a problémát, de most már koncentrálni nem a folyamat azonosítóját, és azonosító Flow, hiszen a folyamat virtuális DOS-gép tartalmazhat több 16 bites feladatok, amelyek mindegyike végezzük annak áramlását. Hogy küldjön WM_CLOSE használjuk EnumWindows KillAppEnumWindows16 működjön átviteli függvény:

16 bites feladatok esetén nem tudjuk használni a folyamatkezelőt, hogy várja meg a feladat befejezését, mert a virtuális DOS gép folyamata nem fejezhető be, ha más feladatok is benne maradnak. A feladat befejezésének meghatározásához az IsWOWTask függvényt használjuk. amely mellékhatásként visszaküldi a feladatazonosítót.

Az IsWOWTask a VDMEnumTaskWOW függvényre támaszkodik. exportálva a VDMDBG.DLL-ből, melyet a cikk Hogyan írja le a 16 bites feladatokat a Windows NT alatt?

Mint például a 32 bites alkalmazások esetében, 100 milliszekundumos intervallumban egy felhasználó által definiált függvényt hívunk. Ha a felhasználó által definiált függvény határozza meg, hogy erőszakosan leállítja a feladatot, hívjuk a TerminateWOWTask függvényt. amely nem más, mint egy csomag a VDMTerminateTaskWOW környékén.

Összefoglalva, fontolja meg a KillApplication használatához szükséges egyéni funkció megvalósításának több lehetőségét. A függvény első változata végrehajtja a várakozást egy rögzített időzítéssel:

Feltételezzük, hogy a KillApplication lParam paramétere a várakozás ideje. Például egy ilyen hívás 15 másodperces várakozást eredményez:

A kifinomultabb változata a felhasználói függvény a következő feldolgozza az üzeneteket a folyamat a várakozás, hogy a funkció közvetlenül hívható a UI szál, félelem nélkül, hogy blokkolva lesz:

Még kifinomultabb változata, amely feldolgozza az üzenetet, és megjeleníti a végén 15 másodpercet kell várni a párbeszédablak, megtalálja a forráskód a demo alkalmazás Process Viewer, amely kíséri ezt a cikket.

  1. Q178893 HOGYAN: Végezze el a "Cleanly" alkalmazást a Win32-ben. Microsoft Tudásbázis.