Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 906
от 26.08.2007, 18:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 467, Экспертов: 76
В номере:Вопросов: 2, Ответов: 5


Вопрос № 99118: Здравствуйте, эксперты! Я делаю для программы возможность "расширять" ее функциональность - плагины в виде подключаемых DLL. Прочитал несколько статей на разных сайтах (типа Delphi World) и выбрал одну, по моему наиболее легкую, и н...
Вопрос № 99144: Приветствую, уважаемые эксперты! Подскажите пожалуйста, как найти окно если его заголовок постоянно меняется, например как при закачке файла. ..

Вопрос № 99.118
Здравствуйте, эксперты!
Я делаю для программы возможность "расширять" ее функциональность - плагины в виде подключаемых DLL.
Прочитал несколько статей на разных сайтах (типа Delphi World) и выбрал одну, по моему наиболее легкую, и на базе ее решил сделать плагины. В приложении я привел код, которым пользуюсь. Программа ищет DLL, в которой есть процедура PluginName, и если ее находит, то запоминает ее в StringList, делает подпункт меню с этим именем, и делает обработчик события на этот пункт меню. Код полностью рабочий, но загвоздка вот в чем:
Получается, что так для каждой новой функции надо делать свою отдельную DLL, то есть, плагин содержит только одну функцию, а как сделать, чтобы подключалась DLL с разным набором процедур? Чтобы в одной было 2 шт, в другой, может 10.
Спасибо за ответы!!!

Приложение:

Отправлен: 21.08.2007, 13:05
Вопрос задал: Кривцов Александр (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Delph
Здравствуйте, Кривцов Александр!

Я бы попробовал примерно такое решение: жёстко определить в библиотеке не одну, а, например, 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.57 от 25.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное