ПредишенСледващото

За да завърши точно на молбата, да му изпълни необходимо почистване, трябва да изпратите съобщение WM_CLOSE за всички видими прозорци най-високо ниво, принадлежащи към заявлението. Изпращане на съобщение WM_CLOSE е еквивалентно на менюто Close система. Ако заявлението е написано правилно, това ще освободи ресурси и край. Трябва да сме подготвени за това, че за приключването на процеса може да се забави. Haprimer, приложението може да поиска от потребителя, ако той иска да запишете файла. Ако заявлението не е завършена в разумни срокове, няма да имаме друг избор, освен да се приложи "тежката артилерия" - функция TerminateProcess.

За да се осигури максимална гъвкавост в очакванията на организацията, решихме да напише молба стоп функция в съответствие със следната прототип.

параметър HWnd идентифицира приложението, което ние искаме да завърши, тя може да бъде всеки прозорец, принадлежащи към заявлението. параметър PfnWaitCallback уточнява, дефинирана от потребителя функция, която ще се нарича периодично в процеса на чакащите. Програмата може да използвате функциите за обработка на съобщение до функцията спира чака процеса. В допълнение, дефинирана от потребителя функция разпознава, когато има достатъчно време да се изчака и да използва груба сила: върнатата стойност на функцията определя по-нататъшното KillApplication поведение.

Веднага цялостен процес, използвайки TerminateProcess

Функцията първо определя идентификатора на процеса и нишката, която е собственик на определен прозорец - те идват по-удобен за в бъдеще да се идентифицират стоп приложения. След това, функцията проверява дали определен прозорец принадлежи към проблема с 16-битов в Windows NT. 16-битови задачи изискват специално лечение, а ние ги разглеждаме отделно.

В случая с 32-битова, функцията се отваря ръкохватка (дръжка) процес с правата на достъп и да синхронизира PROCESS_TERMINATE а. Ако ние нямаме такива права по отношение на извършването на процеса, функцията веднага се провали. Функцията след това изпраща WM_CLOSE съобщение на всички прозорци на най-високо ниво, собственост на процеса, за които ние използваме EnumWindows. посочва като функция на прехвърляне KillAppEnumWindows функция. текстът на която е даден по-долу.

След съобщенията, изпратени, функцията превключва в режим на цикъл. На всеки 100 милисекунди той предизвиква определен от потребителя функция, тя дава възможност за обработка на натрупаните съобщения и да реши дали да продължите да чакате. Няма цикъл се случва се случва, когато едно от двете събития: приключването на този процес и се връща WaitForSingleObject WAIT_OBJECT_0 или потребителски дефинирана функция връща стойност, различна от KILLAPP_WAIT. Ако стойността на връщане на функцията на потребителя е KILLAPP_TERMINATE, тогава процесът се прекратява чрез насилствено TerminateProcess.

Както вече споменахме, 16-битови задачи се извършват по специален начин. Тяхната основна разлика от задачата на 32-битова за нас е фактът, че някои 16-битови задачи могат да споделят един и същ процес на WOW VDM, така че логиката, че използва за попълване на заявление за 32-битова е неизползваем. На първо място, тук е функцията код IsWOWProcess. който се използва за разграничаване на задачата на 16-битов:

IsWOWProcess съдържа всички виртуални машини DOS WOW използване VDMEnumProcessWOW функция на VDMDBG.DLL. Ако прозорецът е посочен като параметър KillApplication. Той принадлежи към един от тези процеси, това означава, че ние се занимаваме с 16-битов задача.

За 16-битови цели, ние също изпращаме WM_CLOSE съобщение на всички прозорци на този проблем най-високо ниво, но сега не се фокусира върху идентификатора на процеса, както и чрез ID Flow, тъй като процесът на виртуална най-машините DOS могат да съдържат няколко 16-битови задачи, всяка от които се извършва в потока й. За да изпратите WM_CLOSE ние използваме EnumWindows KillAppEnumWindows16 да функционира като функция за превод:

В случая с 16-битови задачи не можем да използваме дескриптора процес, за да се изчака приключването на задачата, тъй като процесът на DOS-виртуални машини не може да бъде завършена, ако имаше други проблеми. За да се определи дали задачата е завършена ние използваме IsWOWTask. които като страничен ефект се връща идентификатор на задача.

IsWOWTask разчита на функция VDMEnumTaskWOW. изнесени от VDMDBG.DLL, което бе счетено в статията Как да прехвърля 16-битов задача под Windows NT?.

Както и в случая с 32-битови приложения, което наричаме потребителски дефинирана функция, с интервал от 100 милисекунди. Ако дефинирани от потребителя функция реши да приключи работната група, което наричаме TerminateWOWTask. която не е нищо повече от една обвивка около VDMTerminateTaskWOW.

В заключение, ние се предвиждат няколко варианта за изпълнение на потребителски дефинирана функция за използване с KillApplication. Първата версия на функцията изпълнява фиксирана изчакване изчакване:

Предполага се, че като параметър lParam за KillApplication ще покаже до края на времето за изчакване. Например, такъв разговор ще доведе до 15-секундно чакане:

По-сложен вариант на потребителски дефинирана функция, следните процеси съобщенията в процес на изчакване, така че функцията може да се нарече точно на нишката на потребителския интерфейс, без да се страхува, че той ще бъде блокиран:

Още по-сложен вариант, който обработва съобщението и дисплеи в края на 15 секунди, за да се изчака диалоговия прозорец, можете да намерите в изходния код на програмата за преглед на процеса демо приложение, който придружава тази статия.

  1. Q178893 HOWTO: Да прекрати Application "Чисто" в Win32. База на Microsoft Knowledge.
Подкрепете проекта - споделете линка, благодаря!