Блогът на GunSmoker (преводи) Какво мога да направя с HINSTANCE, върнат от функцията ShellExecute

. когато промяната на съзнанието става толкова лесна, колкото програмирането на компютър, какво означава да си човек.

Какво мога да направя с HINSTANCE, върнат от функцията ShellExecute?

Защо ви казвам неща, които са толкова добре описани в MSDN? Защото хората все още не могат да съберат две плюс две. Виждал съм хора да вземат HINSTANCE от извикване на ShellExecute и да изреждат всички прозорци в системата, търсейки прозорец, равен на GWLP_HINSTANCE (или GWL_HINSTANCE, ако все още живеете в непросветения "64-битов несъвместим" свят). Това няма да работи поради причините, които вече посочих по-горе. Първо, точната стойност, която получавате, изобщо няма смисъл. Дори и да имаше смисъл, нямаше да ви даде нищо, тъй като HINSTANCE не са уникални (всъщност HINSTANCE на процес почти винаги е $00400000, тъй като това е стойността по подразбиране в повечето линкери).

Най-честата причина за подобни извращения е, че искат да направят нещо с новостартиралата програма - най-често: изчакайте да излезе, което трябва да означава, че потребителят е затворил документа. За съжаление, този план има много клопки.

Първо, както вече беше отбелязано, HINSTANCEs, получени от ShellExecute, са безполезни. Можете обаче да използвате новата функция ShellExecuteEx и да зададете флага SEE_MASK_NOCLOSEPROCESS в записа TShellExecuteInfo, което ще накара манипулатора на процеса да бъде записан в полето hProcess. Но пак няма да стане.

Въпросът е, че документът може да бъде отворен без създаване на нов процес. Най-честият (но в никакъв случай единствен) случай от този вид е, когато манипулатор на файлове регистрира DDE взаимодействие. В този случай съществуващото (вече работещо) копие на програмата отнемаотговорност за отваряне на документа. Тогава чакането на процеса да излезе няма да е същото като чакането потребителят да затвори документа, тъй като затварянето на документа в програмата не затваря самата програма.

Ако потребителят затвори документа, това не означава, че процесът ще приключи. Повечето програми просто ще затворят документа и ще продължат да работят, което ви позволява да отворите или създадете нов документ чрез менюто "Файл". Когато се отвори нов документ, потребителят може да затвори стария (това се отнася дори за програми с един документ, които автоматично ще затворят текущия документ, когато се създаде/отвори нов). Освен това дори затварянето на всички прозорци на програмата не винаги води до нейното затваряне. Някои програми работят във фонов режим дори след като всичките им прозорци са затворени - или за да осигурят някои фонови услуги, или просто защото очакват потребителят скоро да работи отново с програмата, така че забавят излизането за известно време - в случай че са необходими през следващите няколко минути, така че спестяват време за стартиране.

Но дори и процесът да приключи, това не означава, че документът е затворен. Някои програми (тези, които не използват DDE) намират своето първо работещо копие и му дават документ за отваряне, след което излизат. Другите програми са само мъничета, които просто стартират други програми, за да вършат работа. Във всеки случай, новосъздаденият процес излиза почти веднага, но документът остава отворен, тъй като отговорността за него се прехвърля на друг процес.

Няма единен начин за установяване, че даден документ е затворен. Всяка програма обработва документи по различни начини. Ако имате късмет, програмата ще ви дадесвойства, които ви позволяват да наблюдавате състоянието на отворен документ. Както видяхме по-рано, Explorer предоставя свойства за списък на отворените прозорци. Доколкото разбирам, Microsoft Office също предоставя доста подробен набор от интерфейси за автоматизиране на своите софтуерни компоненти.