Вопрос № 99118: Здравствуйте, эксперты!
Я делаю для программы возможность "расширять" ее функциональность - плагины в виде подключаемых DLL.
Прочитал несколько статей на разных сайтах (типа Delphi World) и выбрал одну, по моему наиболее легкую, и н...Вопрос № 99144: Приветствую, уважаемые эксперты!
Подскажите пожалуйста, как найти окно если его заголовок постоянно меняется, например как при закачке файла.
..
Вопрос № 99.118
Здравствуйте, эксперты!
Я делаю для программы возможность "расширять" ее функциональность - плагины в виде подключаемых DLL.
Прочитал несколько статей на разных сайтах (типа Delphi World) и выбрал одну, по моему наиболее легкую, и на базе ее решил сделать плагины. В приложении я привел код, которым пользуюсь. Программа ищет DLL, в которой есть процедура PluginName, и если ее находит, то запоминает ее в StringList, делает подпункт меню с этим именем, и делает обработчик события на этот пункт меню. Код полностью рабочий, но загвоздка вот в чем:
Получается, что так для каждой новой функции надо делать свою отдельную DLL, то есть, плагин содержит только одну функцию, а как сделать, чтобы подключалась DLL с разным набором процедур? Чтобы в одной было 2 шт, в другой, может 10.
Спасибо за ответы!!!
Я бы попробовал примерно такое решение: жёстко определить в библиотеке не одну, а, например, 2 функции. 1-я будет сообщать о количестве подпрограмм, поставляемых с данной dll-кой, а вторая - по номеру возвращать информацию о подпрограмме и подпункте меню (через var-параметры), а также булевское значение (true/false - в зависимости от успеха поиска) в качестве своего значения. При таком подходе Вы, думаю, сможете сразу получить список всех расширений, поставляемых с конкретной dll-кой.
--------- Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: 7-ой класс)
Ответ отправлен: 21.08.2007, 13:26 Оценка за ответ: 5 Комментарий оценки: Спасибо, идеи хорошие. Хотелось бы получить рабочий код, а то DLL по одной подключаются, а обе - никак! Если поможете далее, буду признателен.
Отвечает: Бурка Юрий Викторович
Создайте в библиотеке плагина функции, возвращающие
количество экспортируемых подпрограмм и их имена.
Или, как вариант, научите свою программу разбирать
экспорт библиотеки (см. формат PE файла), но первый
вариант проще.
--------- З.Ы. И восьми бит тебе в байте.
Ответ отправил: Бурка Юрий Викторович (статус: 1-ый класс)
Ответ отправлен: 21.08.2007, 14:28 Оценка за ответ: 5 Комментарий оценки: Мысли очень дельные, спасибо! Поробовал, но кое-чего не получается.
Вопрос № 99.144
Приветствую, уважаемые эксперты!
Подскажите пожалуйста, как найти окно если его заголовок постоянно меняется, например как при закачке файла.
Отправлен: 21.08.2007, 15:46
Вопрос задал: Олег Ю. (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Dr.Alex
Здравствуйте, Олег Ю.!
В функции FindWindow - 2 параметра. Один - это имя класса окна, а второй - это заголовок окна. Если заголовок меняется, поищи по имени класса окна. Для того, что бы увидеть это название класса, нужно запустить искомую программу и посмотреть каким-нибудь ProcessExplorer-ом или чем то подобным. Эти проги показывают имя класса окна. Я пользуюсь "AnVir Task Manager" для этого. Ссылка на него - "http://www.anvir.com/index_ru.htm".
Ответ отправил: Dr.Alex (статус: 10-ый класс)
Ответ отправлен: 21.08.2007, 15:54 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: Zwieback
Здравствуйте, Олег Ю.!
Для этого нужно использовать функцию FindWindow(lpClassName, lpWindowName: PChar)
Первый параметр - имя класса, второй - заголовок окна.
См. пример использования в приложении.
p.s. а если имя класса не известно, то можно попробовать в цикле пройти названия всех окон и одновременно сравнивать с заголовком, который Вам нужно найти.
Приложение:
--------- Бывает что все удается, не пугайтесь, это пройдет!
Ответ отправил: Zwieback (статус: 1-ый класс)
Ответ отправлен: 21.08.2007, 15:58 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: Бурка Юрий Викторович
Здравствуйте, Олег Ю.!
Можно искать по классу окна, если он уникален.
Ну, а если по имени... Допустим, программа называется
blabla и при закачке меняет название на blabla ftp://ссылка...
Тогда, перебирая окна через EnumWindow, проверяете на вхождение
blabla в заголовок... И неплохо бы проверять на IsParent, чтобы
не копаться в его потомстве.
--------- З.Ы. И восьми бит тебе в байте.
Ответ отправил: Бурка Юрий Викторович (статус: 1-ый класс)
Ответ отправлен: 21.08.2007, 16:50 Оценка за ответ: 5