Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Вниз

Закрытие exe из dll   Найти похожие ветки 

 
OOOoo   (2003-04-29 08:39) [0]

Здравствуйте МАСТЕРА!
Пишу dll, по сути являющейся плагином к exe, написанному одной фирмой. Кроме того, возможно (и предполагается в дальнейшем) использование этой dll с другими exe. В частности написал свой простенький exe для вызова этой dll, но поскольку вся задача этого exe состоит только в том, чтобы запустить эту dll, то главную форму я спрятал. Возникает вопрос, как теперь из dll завершать процесс? В трее болтается иконка, и на нее подвешено меню. Из своего exe в dll я передал hWnd главной формы и, посылая WM_CLOSE, получаю то, что надо. Но это только со своим exe. А хотелось бы иметь возможность из dll определить hWnd главной формы любого процесса, который загрузил мою dll и посылать ему соответствующее сообщение. Что-то поискал в хелпе, но кроме GetCurrentProcess и GetCurrentProcessID более ничего не нашел, а что делать с этими ума не приложу.
Спасибо за внимание.


 
Digitman   (2003-04-29 08:51) [1]


> главной формы любого процесса


консольный процесс в отличие от процесса GUI-приложения может не иметь ни одного окна (ни главного ни иного), но при этом ничто не мешает ему загрузить и использовать твою DLL

об этом ты задумывался ?


 
ooooo   (2003-04-29 09:01) [2]

> Digitman © (29.04.03 08:51)
Хорошо. Не "любого", а "любого GUI". Я не буду использовать консольные процессы однозначно.
В таком контексте есть, что посоветовать?


 
ooooo   (2003-04-29 09:14) [3]

Ну или так поставлю вопрос. Как корректно завершить процесс из dll?


 
Digitman   (2003-04-29 09:33) [4]


> Как корректно завершить процесс из dll


В общем случае, корректно - никак. 100%-я корректность не гарантирована. Логики работы "чужого" процесса ты заведомо не знаешь. Узнать, какое из окон "чужого" процесса является "главным" в общем случае также невозможно - в общем случае не существует гарантированных признаков того, некое окно является "главным". Даже если всем найденным верхнеуровневым окнам процесса разослать WM_DESTROY, нет никакой гарантии, что процесс завершится (да еще и корректно), ибо кроме окон процесс может иметь доп.код.потоки, алгоритмы корректного терминирования известны лишь разработчику "чужого" приложения.

Так что советую выбросить эту затею из головы - блажь это, и не более того)... Да и концептуально это выглядит более чем подозрительно : библиотека должна в конечном итоге "убить" саму себя !



 
ooooo   (2003-04-29 09:47) [5]

> Digitman © (29.04.03 09:33)

Хорошо. Значит оставляю так, как сделал. Спасибо за участие.


 
ooooo   (2003-04-30 08:21) [6]

И все-таки я его сделал!

> Да и концептуально это выглядит более чем подозрительно:
> библиотека должна в конечном итоге "убить" саму себя !

Ну почему же саму себя? Она только постит главному окну сообщение WM_CLOSE, а это окно уже само знает, что надо делать. И все выходит корректно. Дело в том, что я пишу dll для известных мне exe по известным мне правилам. По умолчанию на пункте меню Exit Visible = False. Если через экспортируемую функцию dll передать hWnd окна, то пункт меню станет видимым.
Итак, в экспортируемой функции, которая является инициализирующей для этого exe (exe через нее получает информацию о реализованных функциях и параметрах), встроен механизм поиска окна текущего процесса с известным именем класса. Это так я подстриваюсь к exe. Если же будет exe подстраиваться к моей dll, то пусть сам передает свой hWnd. Вот и вся проблема.


 
Digitman   (2003-04-30 08:37) [7]


> я пишу dll для известных мне exe по известным мне правилам


ты противоречишь самому себе

сначала ты сказал "любого GUI" (приложения), а это означает, что в числе "любых GUI" приложений может быть и "чужое" приложение, написанное не тобой, исходников которого ты не имеешь и/или алгоритм работы которого тебе совершенно неизвестен.



 
ooooo   (2003-04-30 08:46) [8]

Да, забыл сказать, что это не для "любых". А ведь предвидел такой укол.
Я задавал вопрос более широко, хотел сделать более универсально. Но в конце концов меня интересовало закрытие или известных мне "чужих" приложений (это совсем не означает, что у меня есть их исходники! У меня их нет.), под которые подстраиваюсь я, или тех, которые будут подстраиваться под меня (вот здесь у меня действительно могут быть исходники).
Но в любом случае спасибо. Хоть не стал терять времени на поиск "универсальности".


 
Digitman   (2003-04-30 08:58) [9]


> встроен механизм поиска окна текущего процесса с известным
> именем класса


а откуда ты знаешь имя класса окна, если приложение - "чужое" ?
и с чего ты взял, что искомое окно - именно основное окно приложения ?


 
ooooo   (2003-04-30 09:11) [10]

> а откуда ты знаешь имя класса окна, если приложение - "чужое" ?

есть такая утилита (поставляется вместе с Дельфи) WinSight32 - очень полезный шпион!


 
Digitman   (2003-04-30 09:22) [11]


> есть такая утилита (поставляется вместе с Дельфи) WinSight32
> - очень полезный шпион!


Не спорю - полезная утилита. Но Spy.exe из состава MS VisStudio даже поудобней будет для этой цели.

Тогда другой вопрос возникает :

- если ты ей (утилитой) локализуешь имя класса осн.окна некоего хост-приложения приложения, жестко "прошьешь" это имя в коде плагина, а в след.версии разработчик хост-приложения возьмет да и сменит имя - что тогда ?



 
evvcom   (2003-04-30 09:33) [12]


> а в след.версии разработчик хост-приложения возьмет да и
> сменит имя - что тогда ?

Тогда пункта меню Exit не будет, и закрывать приложение можно будет только стандартным способом.

А вообще он в следующей версии приложения может и не того еще наделать! Поэтому все-равно так или иначе приходится привязываться к версии. Предупрежу сразу следующий возможно вопрос. Программа предназначена для личных целей и для продажи не подразумевается!


 
REA   (2003-04-30 10:02) [13]

Сын Ивана Грозного просит Ивана Грозного убить своего сына.
(Неизвестный художник)


 
Smithson   (2003-04-30 10:08) [14]

Почему же неизвестный! evvcom его звать!


 
evvcom   (2003-04-30 10:16) [15]

Да ладно, хорош прикалываться. Если в exe иконку в трей вешаете и там есть Exit, то это в порядке вещей. А что здесь такого криминального? В коце концов сама винда точно также рассылает "чужим" процессам сообщения о том, что пора им бай-бай и тоже ничего! А вы развели тут Иван Грозный, да сын его Иван...


 
Digitman   (2003-04-30 10:52) [16]


> В коце концов сама винда точно также рассылает "чужим" процессам
> сообщения о том, что пора им бай-бай и тоже ничего


да, рассылает ! но отнюдь не WM_CLOSE ! (см. WM_QUERYENDSESSION, WM_ENDSESSION)
и - обрати внимание - процессы тех приложений, которые производитель не "научил" реагировать должным образом на такие сообщения, Винда принудительно снимает с выполнения ! предварительно запросив подтверждение)


 
evvcom   (2003-04-30 11:47) [17]

The WM_CLOSE message is sent as a signal that a window or an application should terminate.

По-моему этого достаточно, чтобы понять, что так делать можно и вполне корректно.


 
Digitman   (2003-04-30 12:01) [18]


> По-моему этого достаточно


Нет, этого недостаточно !

Реакция приложения на команду закрытия окна (с возможно последующим его разрушением) еще далеко не говорит о том, что следом за закритием/разрушением окна автоматически последует логика терминирования код.потоков процесса (и где-то, в конечном итоге, будет обязательно вызвана ExitProcess)


 
evvcom   (2003-04-30 12:49) [19]

Digitman!
По-моему Вы придираетесь к словам. Если изначально и звучал вопрос как "любого процесса", то на сей момент вроде должно быть уже ясно, что мне надо сэмулировать нажатие на кнопку закрытия главной формы приложения (только не надо думать, что мне также важны визуальные эффекты вдавливания кнопки и отжатия). Пусть после всего этого последуют вопросы типа "а у Вас изменились данные, а следует ли их сохранить? А Вы уверены или не очень?" Юзер (то есть я в роли юзера) сам решит как отвечать на поставленные вопросы. Дело не в этом.
Спасибо за WM_QUERYENDSESSION, WM_ENDSESSION, но что-то не особо ясно, могу ли я это использовать как-то.


 
Digitman   (2003-04-30 13:00) [20]


> evvcom


да как угодно !
я лишь хотел предостеречь от безпочвенной уверенности, что WM_CLOSE для главного окна "чужого" приложения, будучи обработанным, в обязательном порядке ведет к полному и корректному завершению процесса "чужого" приложения"


 
N175   (2003-04-30 13:08) [21]

>Закрытие exe из dll
Используйте TerminateProcess()


 
Digitman   (2003-04-30 13:18) [22]


> N175



> Используйте TerminateProcess()


Ты когда-нибудь в ремарки к этой ф-ции вникал ?


Use it only in extreme circumstances. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.

Terminating a process does not cause child processes to be terminated.
Terminating a process does not necessarily remove the process object from the system. A process object is deleted when the last handle to the process is closed.


 
evvcom   (2003-04-30 14:03) [23]

> N175 (30.04.03 13:08)

Не... TerminateProcess и ExitProcess здесь точно не пойдут.
Да, ладно... И WM_CLOSE замечательно работает, все несохраненное сохраняется, а потом без исключений все завершается.


 
evvcom   (2003-04-30 14:13) [24]

> Digitman ©

Кроме того, даже в исходниках Дельфи в обработчике WM_CLOSE стоит в TCustomForm - Close, а в TApplication - MainForm.Close, что предполагает, что нормально написанное приложение на WM_CLOSE для главной формы должно корректно завершиться.


 
Digitman   (2003-04-30 14:22) [25]


> даже в исходниках Дельфи в обработчике WM_CLOSE стоит


ни о чем не говорит абсолютно !
и вообще - разве речь идет только о "чужих" Делфи-приложениях ?


 
evvcom   (2003-04-30 14:34) [26]


> разве речь идет только о "чужих" Делфи-приложениях ?


Нет, речь идет о

> The WM_CLOSE message is sent as a signal that a window or
> an application should terminate.

Сообщение WM_CLOSE посылается с целью уведомить окно или приложение, что оно должно быть завершено.
И если приложение не Дельфовое, то это не значит, что оно имеет право игнорировать данный тезис. Во всяком случае у меня получилось таким образом нормально завершить приложение, написанное на MS Visual C++ 6, и меня это устраивает.


 
Digitman   (2003-04-30 14:50) [27]


> уведомить окно или приложение


вот именно ! уведомить окно ! это означает, что в результате получения уведомления оно может быть (всего лишь - может быть!) обработано в оконной процедуре таким образом, что будет развернут механизм деинициализации приложения, финалом которого будет ExitProcess() (и то - не в теле этого обработчика, ибо предстоит еще как минимум WM_DESTROY дождаться и обработать)

таким образом, разработчик приложения волен реагировать на WM_CLOSE как ему вздумается ! в т.ч. и запустить алгоритм завершения процесса приложения.


 
evvcom   (2003-04-30 15:09) [28]


> разработчик приложения волен реагировать на WM_CLOSE как
> ему вздумается!


Это его проблемы в таком случае. Я думаю, что дальнейшая дискуссия бессмысленна. Мы все вольны реагировать на любые сообщения, как нам вздумается. Но есть же правила, которые я должен выполнять, чтобы меня считали хорошим человеком. Здесь то же самое. Главное, что нужное мне приложения эти правила выполняет, а работать с другими мне пока нет надобности.


 
Digitman   (2003-04-30 15:39) [29]

>evvcom

возможно, то что ты называешь "правилом" в отношении WM_CLOSE, и есть в большинстве случаев "правило", но - только для осн.окна приложения ! Локализовать же среди верхнеуровневых окон процесса гл.окно - задача в общем случае вовсе не тривиальная


 
evvcom   (2003-04-30 15:42) [30]

Ну, наконец-то! Согласен со всем.


 
Fantasist.   (2003-04-30 18:17) [31]

Ну а что бы не разослать WM_QUIT с помощью PostThreadMessage всем потокам процесса (чтобы точно попасть в главный)? А если твоя длл работает в главном потоке того процесса, который тербуются завершить, так достадочно просто вызвать PostQuitMessage.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.009 c
7-47013
Yurique
2003-03-19 20:11
2003.05.15
Клавиатура


14-46974
TheoS
2003-04-27 01:21
2003.05.15
Проблемма с папкой в Windows XP


3-46661
Gregory
2003-04-22 22:35
2003.05.15
Пароль к БД Paradox


3-46662
Анна
2003-04-24 21:22
2003.05.15
Ссылочная целостность


4-47042
Pattern
2003-03-16 12:41
2003.05.15
GetVersionEx





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский